2

我正在使用 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 的每个新实例都应该产生一个新的分组。谢谢,我在这方面找不到任何东西。

我对桌子设计什么都做不了。这是一个由外部供应商创建的表,与他们的专有软件一起使用。我再说一遍,我对桌子设计无能为力!!!!

4

3 回答 3

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] 
于 2010-10-05T22:15:35.463 回答
2

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

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

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

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

有关数据是什么的更多详细信息将帮助我们了解如何为您提供帮助,一般 col_1, col_2 在这一点上没有帮助。了解这是什么类型的数据可能有助于我们了解您有此要求的原因以及如何建议我们处理此类数据的方式。

于 2010-10-05T18:47:40.510 回答
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
于 2010-10-05T19:28:45.500 回答