我正在尝试针对以下数据集编写查询,该数据集将根据一组唯一字段分隔上次更新的记录。
假设以下示例中唯一的字段集是val1 + val2 + val3。
我尝试使用窗口函数来实现这一点,但是这个例子似乎有另一层次的复杂性。
--DROP TABLE #demo;
-- assume there is a unique key on val1 + val2 + val3
CREATE TABLE #demo
(
id int NOT NULL,
val1 varchar(100) NOT NULL,
val2 varchar(100) NOT NULL,
val3 varchar(100) NOT NULL,
last_updated DATETIME NOT NULL,
active bit not null
);
INSERT INTO #demo VALUES
(0,'a','b','c', '20150817', 0),
(1,'a','b','c', '20150817', 0),
(2,'a','b','c', '20150817', 0),
(3,'a','b','c', '20150815', 0),
(4,'a','b','c', '20150815', 0),
(5,'d','e','f', '20150701', 0),
(6,'d','e','f', '20150630', 0),
(7,'d','e','f', '20150630', 0),
(8,'d','e','f', '20150630', 0)
-- using unique key columns, trying to get only those with the most recent date
SELECT *
, ROW_NUMBER() OVER(PARTITION BY val1, val2, val3 ORDER BY last_updated DESC) AS RowNum
FROM #demo
我希望只返回下面突出显示的记录(id:0,1,2,5)和查询。
这可能吗?提前谢谢。
答案 0 :(得分:1)
SELECT *
FROM (
SELECT *
, DENSE_RANK() OVER(PARTITION BY val1, val2, val3
ORDER BY last_updated DESC) AS RowNum
FROM #demo
)t
WHERE RowNum = 1
答案 1 :(得分:0)
select d.* from
demo d join
(
SELECT val1,val2,val3 ,
max(last_updated) as mx
FROM demo
group by val1,val2,val3) x
on x.val1 = d.val1 and x.val2 = d.val2 and x.val3 = d.val3
and x.mx = d.last_updated
这是另一种方法。