我有一个数据表,表示人们随着时间的推移所做的一系列事件,有时人们会连续几次做同样的事情。如何使用MS SQL 2008选择仅显示这些事件的消歧序列的结果?
Source data:
Person Event Time
1 2 1
1 2 20
1 2 33
2 1 34
1 4 43
1 2 44
2 3 45
1 2 46
1 3 50
1 3 55
Result:
Person Event
1 2
2 1
1 4
1 2
2 3
1 3
答案 0 :(得分:2)
试试这个:
DECLARE @YourTable table (Person int, Event int, Time int)
SET NOCOUNT ON
INSERT INTO @YourTable VALUES (1, 2 , 1)
INSERT INTO @YourTable VALUES (1, 2 , 20)
INSERT INTO @YourTable VALUES (1, 2 , 33)
INSERT INTO @YourTable VALUES (2, 1 , 34)
INSERT INTO @YourTable VALUES (1, 4 , 43)
INSERT INTO @YourTable VALUES (1, 2 , 44)
INSERT INTO @YourTable VALUES (2, 3 , 45)
INSERT INTO @YourTable VALUES (1, 2 , 46)
INSERT INTO @YourTable VALUES (1, 3 , 50)
INSERT INTO @YourTable VALUES (1, 3 , 55)
SET NOCOUNT OFF
;WITH Ranked AS
(SELECT
Person,Event,Time
,ROW_NUMBER() OVER(PARTITION by Person order by time,Person, Event) AS RowNumber
FROM @YourTable
)
SELECT
r1.Person,r1.Event
FROM Ranked r1
LEFT OUTER JOIN Ranked r2 ON r1.RowNumber=r2.RowNumber-1 AND r1.Person=r2.Person
WHERE r1.Event!=ISNULL(r2.Event,-999)
输出:
Person Event
----------- -----------
1 2
1 4
1 2
1 3
2 1
2 3
(6 row(s) affected)
OP没有说哪个版本的SQL Server,所以这里是SQL Server 2005之前的CTE免费版本,输出与上面相同:
SELECT
r1.Person,r1.Event
FROM (SELECT
Person,Event,Time
,ROW_NUMBER() OVER(PARTITION by Person order by time,Person, Event) AS RowNumber
FROM @YourTable
) r1
LEFT OUTER JOIN (SELECT
Person,Event,Time
,ROW_NUMBER() OVER(PARTITION by Person order by time,Person, Event) AS RowNumber
FROM @YourTable
) r2 ON r1.RowNumber=r2.RowNumber-1 AND r1.Person=r2.Person
WHERE r1.Event!=ISNULL(r2.Event,-999)
答案 1 :(得分:0)
我不确定我是否帮助你。也许你想要
SELECT DISTINCT Person, Event FROM Table Where 1 ORDER BY Person;
这会选择所有行,但会删除重复项。所以这应该产生:
Result:
Person Event
1 2
1 4
1 3
2 1
2 3
答案 2 :(得分:0)
我更喜欢COUNT< - > GROUP BY over DISTINCT
SELECT Person, Event, COUNT(Time) Amount FROM Table GROUP BY Person, Event ORDER BY COUNT(Time) DESC
答案 3 :(得分:-1)
从X选择人物,事件,最后(时间) 按人分组,事件