如何在分组时强制SQL Server Group By尊重列顺序?

时间:2010-10-05 18:08:48

标签: sql sql-server sql-server-2005 gaps-and-islands

我正在使用SQL Server 2005。

关于糟糕的桌子设计,请看这篇文章结尾。

我有两列。我想按照第二列的顺序在第一列分组。微软文档说明GROUP BY子句不关心顺序,我该如何强制执行呢?

这是我的伪查询:

SELECT col_1,
       MIN(col_2),
       MAX(col_2)
FROM someTable
GROUP BY col_1 (*** WITH RESPECT TO ORDER OF col_2***)

如果我在下表中运行查询:

Col_1    Col_2
A       1
A       2
A       3
B       4
C       5
C       6
B       7
A       9

我应该得到以下结果:

Col_1  Min   Max
A      1     3
B      4     4
C      5     6
B      7     7
A      9     9

关键部分是我不能在结果集中将A的所有4条记录集中在一起。当查询表/子查询时,它按col_2排序,col_1的每个新实例都应该导致新的分组。谢谢,我找不到任何相关内容。

我可以用表格设计做 NOTHING 。这是一个由外部供应商创建的表,该表与其专有软件一起使用。我再说一遍,我对表设计无能为力!!!!

3 个答案:

答案 0 :(得分:8)

;WITH T
     AS (SELECT Col1,
                Col2,
                DENSE_RANK() OVER (ORDER BY Col2) - 
                   DENSE_RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS G
         FROM   YourTable)
SELECT Col1,
       MIN(Col2) AS [Min],
       Max(Col2) AS [Max]
FROM   T
GROUP  BY Col1,
          G
ORDER  BY [Min] 

答案 1 :(得分:2)

这样的问题几乎总是意味着您的数据库设计不正确,无法返回您需要的结果。

如果要将项目分组,则需要一个字段来指定这些记录是同一组的一部分。然后,您可以按col_1和seried_id进行分组。

如何在插入时确定该行所属的系列是您的问题,并且取决于您的业务规则。您永远不能依赖于按顺序存储的数据,因此您需要在进一步操作之前修复此过程,否则您的数据将永远不会给您正确的结果。

个人如果我有一组记录我想要存储在一起并且我同时插入它们,我会使用带有表变量的存储过程插入它们,这样我就可以插入set toegther并分配系列ID那时候。如果它们不是同时完成的,你必须检查最后插入的记录以确定由于竞争条件而有问题的seriesID(如果它们全部插入在一起,你还必须考虑竞争条件,它们只是不太难处理)。

有关数据的更多详细信息将有助于我们了解如何为您提供帮助,一般col_1,col_2此时无效。知道这是什么类型的数据可能有助于我们理解为什么你有这个要求,以及如何建议我们看到这种类型的数据处理方式。

答案 2 :(得分:0)

我重新创建了你的表和查询,然后我回来了:

col1    (No column name)    (No column name)
A   1   9
B   4   7
C   5   6

我注意到你的查询在MAX(col2)部分之后有一个额外的逗号,这让我相信你的'真实'查询中至少还有一列导致你输入的结果题。我想我需要更多的信息才能获得进一步的帮助。

DECLARE @SomeTable TABLE (Col1 CHAR(1), Col2 INT)

INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 1)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 2)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 3)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 4)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 5)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 6)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 7)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 9)

SELECT col1, 
       MIN(col2), 
       MAX(col2)
FROM @SomeTable 
GROUP BY col1