Tsql 在sql中对记录集进行分组

Tsql 在sql中对记录集进行分组,tsql,Tsql,分组在from和toloc上完成,一个组由usrid指示 组集查询后所需的结果集 from toloc usrid a b 1 c d 1 --- group 1 & 3 combined to form 1 group e f 1 ------------------- a b 2![alt text][1] c d 2 --- grou

分组在from和toloc上完成,一个组由usrid指示

组集查询后所需的结果集

from   toloc  usrid
a        b      1
c        d      1       --- group 1 & 3 combined to form 1 group
e        f      1
-------------------
a        b      2![alt text][1]
c        d      2       --- group 2  
h        k      2
如何实现结果集。
我必须在sql中对类似的记录集进行分组。是否可以使用汇总或新的分组集。我想不出来。

我找到了这个老问题。假设没有重复的行,它应该可以工作

我首先解决了您链接到的那个字段,并重写它以匹配此字段,因此与您的示例相比,这些字段的名称将有所不同

DECLARE @t TABLE (fromloc VARCHAR(30), toloc VARCHAR(30), usr_history INT)

INSERT @t VALUES ('a', 'b', 1)
INSERT @t VALUES ('c', 'b', 1)
INSERT @t VALUES ('e', 'f', 1)
INSERT @t VALUES ('a', 'b', 2)
INSERT @t VALUES ('c', 'b', 2)
INSERT @t VALUES ('e', 'f', 2)
INSERT @t VALUES ('a', 'b', 3)
INSERT @t VALUES ('c', 'd', 3)
INSERT @t VALUES ('h', 'k', 3)

;WITH c as
(
SELECT t1.usr_history h1, t2.usr_history h2, COUNT(*) COUNT 
FROM @t t1
JOIN @t t2 ON t1.fromloc = t2.fromloc and t1.toloc = t2.toloc and t1.usr_history < t2.usr_history 
GROUP BY t1.usr_history, t2.usr_history
), 
d as (
SELECT usr_history h, COUNT(*) COUNT FROM @t GROUP BY usr_history
), 
e as (
SELECT d.h FROM d JOIN c ON c.COUNT = d.COUNT and c.h2 = d.h
JOIN d d2 ON d2.COUNT=c.COUNT and d2.h= c.h1
)
SELECT fromloc, toloc, DENSE_RANK() OVER (ORDER BY usr_history) AS 'usrid' 
FROM @t t 
WHERE NOT EXISTS (SELECT 1 FROM e WHERE e.h = t.usr_history)

这个问题的答案如下:


另一种方法是使用XML路径作为记录集的签名。

我认为您的意思是:当组1的内容=组2或组的内容时,..n则只显示组1,并使用组1中的USRID。对吗?我找到了一个更好的解决方案,但如果我回答了一个差不多一年都没有回答的问题,而没有得到一些信任,我就不会发布它。类似的问题,但回答很好:
DECLARE @t TABLE (fromloc VARCHAR(30), toloc VARCHAR(30), usr_history INT)

INSERT @t VALUES ('a', 'b', 1)
INSERT @t VALUES ('c', 'b', 1)
INSERT @t VALUES ('e', 'f', 1)
INSERT @t VALUES ('a', 'b', 2)
INSERT @t VALUES ('c', 'b', 2)
INSERT @t VALUES ('e', 'f', 2)
INSERT @t VALUES ('a', 'b', 3)
INSERT @t VALUES ('c', 'd', 3)
INSERT @t VALUES ('h', 'k', 3)

;WITH c as
(
SELECT t1.usr_history h1, t2.usr_history h2, COUNT(*) COUNT 
FROM @t t1
JOIN @t t2 ON t1.fromloc = t2.fromloc and t1.toloc = t2.toloc and t1.usr_history < t2.usr_history 
GROUP BY t1.usr_history, t2.usr_history
), 
d as (
SELECT usr_history h, COUNT(*) COUNT FROM @t GROUP BY usr_history
), 
e as (
SELECT d.h FROM d JOIN c ON c.COUNT = d.COUNT and c.h2 = d.h
JOIN d d2 ON d2.COUNT=c.COUNT and d2.h= c.h1
)
SELECT fromloc, toloc, DENSE_RANK() OVER (ORDER BY usr_history) AS 'usrid' 
FROM @t t 
WHERE NOT EXISTS (SELECT 1 FROM e WHERE e.h = t.usr_history)