在前两行SQL Server之后选择分组行

时间:2016-02-11 21:10:48

标签: 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 |

我想省略一个可变数量的前导行(在这种情况下是最近的日期),并且假设在这个例子中该数字是2。结果表将是这样的:

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

这在SQL中可行吗?基本上我想过滤使用日期列作为order by的未知行数。目标是获取最旧的类型并获得流程中的UID列表。

2 个答案:

答案 0 :(得分:2)

当然,这是可能的。使用ROW_NUMBER函数为每行分配一个值,按SharedID列进行分区,以便每次ID更改时重新开始计数,并选择值大于限制的行。

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;

答案 1 :(得分: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 
)