我正在使用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 。这是一个由外部供应商创建的表,该表与其专有软件一起使用。我再说一遍,我对表设计无能为力!!!!
答案 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