SQL - 使用OVER子句获取基于Datetime的子集

时间:2015-08-17 22:41:24

标签: sql sql-server

我正在尝试针对以下数据集编写查询,该数据集将根据一组唯一字段分隔上次更新的记录。

假设以下示例中唯一的字段集是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)和查询。result

这可能吗?提前谢谢。

2 个答案:

答案 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

这是另一种方法。

Fiddle