使用Order By和Group BY折叠数据

时间:2014-07-08 12:43:19

标签: mysql sql sql-server

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

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

让我们举例如下:

在Mysql中

sql fiidle

假设我们有表“test”和3列(colA,colB和colC)

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

我通过以下查询在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中相同的功能。

提前致谢..

5 个答案:

答案 0 :(得分: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)区域

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

子查询中不需要order by

答案 3 :(得分:0)

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对列进行分区并按顺序排序。

答案 4 :(得分:0)

你的问题确实没有意义。要么是每个组都需要 colc 的最小值,要么是 colc 的第一个组值。例如,Nesuke的解决方案完全符合您的小提琴示例。那么为什么你想在分组之前通过可乐 colb 订购?