如何消除sql中序列的歧义?

时间:2010-03-22 13:32:41

标签: sql-server

我有一个数据表,表示人们随着时间的推移所做的一系列事件,有时人们会连续几次做同样的事情。如何使用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

4 个答案:

答案 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选择人物,事件,最后(时间) 按人分组,事件