2016-02-11 47 views
2

这是一个棘手的问题/情况,我的搜索fu失败了我。在前两行后选择分组行SQL Server

可以说我有以下数据

| UID | SharedID | Type | Date  | 
|-----|----------|------|-----------| 
| 1 | 1  | foo | 2/4/2016 | 
| 2 | 1  | foo | 2/5/2016 | 
| 3 | 1  | foo | 2/8/2016 | 
| 4 | 1  | foo | 2/11/2016 | 
| 5 | 2  | bar | 1/11/2016 | 
| 6 | 2  | bar | 2/11/2016 | 
| 7 | 3  | baz | 2/1/2016 | 
| 8 | 3  | baz | 2/3/2016 | 
| 9 | 3  | baz | 2/11/2016 | 

而且我想ommit(在这种情况下,最近的日期)可变数量领先行,并且可以说,这个数字在本例中2。生成的表格会是这样的:

| UID | SharedID | Type | Date  | 
|-----|----------|------|-----------| 
| 1 | 1  | foo | 2/4/2016 | 
| 2 | 1  | foo | 2/5/2016 | 
| 7 | 3  | baz | 2/1/2016 | 

这是可能的SQL?基本上我想过滤未知数量的行,使用日期列作为顺序。目标是获取最旧的类型,并获取过程中的UID列表。

回答

2

当然,这是可能的。使用ROW_NUMBER函数为每行分配一个值,并按SharedID列进行分区,以便每次标识更改时重新启动计数,然后选择那些值大于您的限制的行。

WITH cteNumberedRows AS (
    SELECT UID, SharedID, Type, Date, 
      ROW_NUMBER() OVER(PARTITION BY SharedID ORDER BY Date DESC) AS RowNum 
     FROM YourTable 
) 
SELECT UID, SharedID, Type, Date 
    FROM cteNumberedRows 
    WHERE RowNum > 2; 
+0

这些都是我不知道的所有事情都可能的,谢谢你的见解。这工作像一个魅力。 –

0

不知道我是否明白你的意思,但是像这样?

SELECT * FROM MyTable t1 JOIN MyTable T2 ON t2.id NOT IN (
SELECT TOP 2 UID FROM myTable 
WHERE SharedID = t1.sharedID 
ORDER BY [Date] DESC 
)