【问题标题】:CTE is behaving unexpectedly when an aggregate function is used使用聚合函数时 CTE 行为异常
【发布时间】:2018-11-22 15:45:25
【问题描述】:

当我在 CTE 中使用聚合函数时,我收到一条错误消息。下面是查询和与之关联的错误消息。当我删除聚合函数时它工作正常。某处我错过了诀窍。

代码:

;
With CTE as (
    Select
        sn,
        ed,
        sum(c) c,
        row_number() over (partition by sn, ed order by sn, sum(c) desc, ed) rn
    from TD
    where ed >= '11/15/2018'
)
select * from CTE

错误信息:

TD.sn 列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 group by 子句中。

【问题讨论】:

  • sum(c) 你已经到了那里意味着你需要一个group by sn, ed 来使其余的列真正分组,否则不清楚你要做什么。也许您也想打开sum 的窗口:sum(c) over (...)。否则你需要另一个子查询。
  • 是的!我也想窗口总和。如果我使用 group by sn, ed 那么我不会得到预期的结果。在这种情况下,Row_number 不起作用。
  • 你能解释一下你期望从这个查询中得到什么结果吗?

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

您在查询中使用了聚合函数但未使用 group by

With CTE as (
    Select
        sn,
        ed,
        sum(c) c,
        row_number() over (partition by sn order by  sum(c) desc) rn
    from TD
    where ed >= '11/15/2018'
   group by sn,
        ed
)
select * from CTE where rn<=3

【讨论】:

  • 如果我使用下面的查询,每行的 row_number 保持为 1。我想要特定 ed 的每个 sn 的前三个 c。示例:对于 sn 'a',有两个 ed 1 和 2。所以有两行不同的 c。我希望 rownumber 根据 c 的最大值显示 1 和 2
  • @Madhukar 我没有看到您的示例数据和输出,所以我只是更正了您的代码,我认为您必须更改分区并按列排序,我编辑查询您现在可以检查
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多