【问题标题】:Collapse Data using Order By and Group BY使用 Order By 和 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 中相同的功能。

提前谢谢..

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案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 以便我可以选择每个组的正确行
      • 检查我的编辑答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多