2015-02-11 53 views
0

请参阅下面的DDL:使用SQL或TSQL

CREATE TABLE Groups 
(
    GroupID integer not null, 
    Dataset int, 
    URN int, 
    DateAdded datetime 
) 

INSERT INTO Groups(1,1,100,'2010-01-01') 
INSERT INTO Groups(1,1,191,'2011-01-01') 
INSERT INTO Groups(1,1,65,'2012-01-01') 
INSERT INTO Groups(1,2,121,'2013-01-01') 

INSERT INTO Groups(2,1,87,'2010-01-01') 
INSERT INTO Groups(2,1,1081,'2011-01-01') 
INSERT INTO Groups(2,1,32,'2012-01-01') 
INSERT INTO Groups(2,1,16,'2013-01-01') 
INSERT INTO Groups(2,2,66,'2013-01-01') 

我试图返回一个表是这样的:

100 191 
100 65 
87 1081 
87 32 
87 16 

塔1组ID和列2是URN。列表满足标准:

  1. 选自

  2. 始终显示最早URN获取为1的数据集中的所有记录(使用dateadded)在第1列(其中,数据集= 1)。在柱2把另一个URN选自(其中数据集= 1)

  3. 确保所有的URN(WHERE数据集= 1)从该组中的第2列中出现一次,除了出现在列中的URN 1

我相信我必须以编程方式(使用TSQL)来完成此操作,但是我想知道是否有一种使用SQL的方法。

+0

您的结果不符合你们所要求的。根据你的要求,你应该只能得到2条记录(每组一个)。 – 2015-02-11 21:34:16

+0

@D斯坦利,我编辑了要求,试图使其更加清晰。 – w0051977 2015-02-11 21:37:16

+0

它仍然不匹配。组1中最古老的URN为100,而组2中最古老的URN为78.除了最老的一个,您正在显示所有记录。 – 2015-02-11 21:39:12

回答

1

您可以使用FIRST_VALUE获得各组的最古老的URN

SELECT FIRST_VALUE(URN) OVER (PARTITION BY GroupID ORDER BY DateAdded) AS OldestURN, URN 
FROM Groups 
WHERE Dataset = 1 

输出:

OldestURN URN 
--------------- 
100   100 
100   191 
100   65 
87   87 
87   1081 
87   32 
87   16 

然后,只需窝内另一个上面查询得到仅记录OldestURN <> URN

SELECT OldestURN, URN 
FROM (
    SELECT FIRST_VALUE(URN) OVER (PARTITION BY GroupID ORDER BY DateAdded) AS OldestURN, 
      URN 
    FROM Groups 
    WHERE Dataset = 1) t 
WHERE OldestURN <> URN 

输出:

OldestURN URN 
--------------- 
100   191 
100   65 
87   1081 
87   32 
87   16 
+0

谢谢。我认为这可能会做到。 +1。我会明天测试并报告回来。 – w0051977 2015-02-11 22:20:15