这是一个棘手的问题/情况,我的搜索失败了。
假设我有以下数据
| 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列表。
答案 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
)