使用 Order By 和 Group BY 折叠数据

Posted

技术标签:

【中文标题】使用 Order By 和 Group BY 折叠数据【英文标题】:Collapse Data using Order By and Group BY 【发布时间】:2014-07-08 12:43:19 【问题描述】:

我正在将我的 mysql 脚本转换为 sql server 脚本。

我想对数据进行排序,然后按某些标准折叠数据。

举个例子:

在Mysql中:

sql fiidle

假设我们有表“测试”和 3 列(colA、colB 和 colC)

现在我想按 colA 和 colB 对数据进行排序,然后想选择 colA,colB 组的第一行 我也想为 colA,colB 组找到 MIN(colC)

我通过下面的查询在mysql中实现了:

select colA, colB, min(ColC) 
from ( select * 
       from test 
       order by colA,colB) tempalias 
group by colA, colB

现在我的情况是 sql server:

当我尝试执行相同的查询时,它给了我以下错误:

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。

谁能帮助我如何在 sql server 中获得与我在 mysql 中相同的功能。

提前谢谢..

【问题讨论】:

【参考方案1】:

我认为这应该是诀窍。不知道效果好不好,可以试试

SELECT t1.cola, t1.colb, t1.colc FROM
    (SELECT *, ROW_NUMBER() OVER(ORDER BY cola, colb) AS RowNumber
        FROM test) t1
JOIN
(SELECT cola, colb, MIN(RowNumber) AS RowNumber
    FROM
        (SELECT *, ROW_NUMBER() OVER(ORDER BY cola, colb) AS RowNumber
        FROM test) AS SUBQUERY_01
        GROUP BY cola, colb) t2
ON t1.cola = t2.cola AND t1.colb = t2.colb AND t1.RowNumber = t2.RowNumber

如果您想按条件更改订单,您必须同时编辑 OVER(ORDER BY cola, colb) 区域

【讨论】:

【参考方案2】:
select colA, colB, min(colC) from test group by colA, colB order by colA, colB

【讨论】:

老实说,我不知道这是否是正确的答案,但通常会在您的代码中提供一些注释。 我认为它会先按数据分组,然后再对数据进行排序。我想先对数据进行排序,然后需要应用 group by 以便我可以选择每个组的正确行【参考方案3】:

以下是两个数据库中的正确方法:

select colA, colB, min(ColC) 
from test t
group by colA, colB;

子查询中不需要order by

【讨论】:

我想先对数据进行排序,所以当我使用 group by 时,它将选择所需的第一行组,并且在我应用 group By 之前我需要先对数据进行排序。 为什么你认为你需要在分组之前进行排序?这没有任何意义。 @RonakShah。 . . min() 获取`最小值。这就是你所需要的。您不需要在子查询中进行排序。而且,在大多数数据库中,这也没有任何影响。【参考方案4】:

您的问题实际上没有任何意义。您想要每个组的 colc 的最小值或 colc 的第一个组值。例如,Nesuke 的解决方案正是您的小提琴示例所做的。那么为什么要在分组前按colacolb排序呢?

【讨论】:

我想我同意这个 sql fiddle 示例让人感到困惑,我不想只找到 MIN 但我想选择组的第一行排序数据。 ordar by cols 和 group by cols 可能不同。所以首先我需要先按一些列对数据进行排序,然后在该结果集上我想与其他一些列进行分组。如果您感到困惑或有任何疑问,请告诉我 我已经编辑了我的答案。我想你一直很困惑。您想要做的是根据 colC 和与该值对应的相应行找到最小值。在这种情况下,如果您查看我的第二个解决方案(即使它与此问题中给出的 DDL 的结果相同),您可能会找到您的解决方案。【参考方案5】:
create table test(cola int,colb int,colc int);

insert into test values(1,2,3);
insert into test values(1,2,4);
insert into test values(2,3,30);
insert into test values(2,3,39);
insert into test values(3,4,100);

select colA,colB,min(ColC) 
from test
group by colA,colB
order by colA,colB

你能做到吗?

编辑:

;with cte as (
select colA, colB, colC
, row_number() over(
    partition by colA, colB
        order by colC) as rn
from test
group by colA, colB)
select colA, colB, colC
from cte
where rn = '1'

使用 CTE 对列进行分区和排序。

【讨论】:

我认为它会先按数据分组,然后再对数据进行排序。我想先对数据进行排序,然后需要应用 group by 以便我可以选择每个组的正确行 检查我的编辑答案。

以上是关于使用 Order By 和 Group BY 折叠数据的主要内容,如果未能解决你的问题,请参考以下文章

sql语句执行顺序之group by、order by

sql中group by和order by的区别

order by 和 group by 的区别

使用 dplyr、group_by 和折叠或汇总连接字符串/行,但保持 NA 值 [重复]

GROUP BY 和 ORDER BY一起使用时,要注意的问题!

一起使用 ORDER BY 和 GROUP BY