如果一个字段在SQL中相同,如何过滤上一条记录

时间:2019-04-30 10:45:27

标签: sql sql-server tsql

我有如下记录:

ID            Date              Title        User 
1   2019-04-29 14:15:55.567      A           1222
2   2019-04-29 14:25:13.530      A           1222
3   2019-04-29 15:17:07.210      A           1222
4   2019-04-29 16:05:49.067      B           1048
5   2019-04-29 16:36:37.330      C           681
6   2019-04-29 16:37:16.250      C           681
7   2019-04-29 16:37:49.160      D           681
8   2019-04-29 16:38:48.803      C           681

我要检查每个记录是否与先前的记录相同,如果两者的标题相同,请忽略先前的记录。

我希望看到这样的结果:

ID            Date              Title        User 
3   2019-04-29 15:17:07.210      A           1222
4   2019-04-29 16:05:49.067      B           1048
6   2019-04-29 16:37:16.250      C           681
7   2019-04-29 16:37:49.160      D           681
8   2019-04-29 16:38:48.803      C           681

3 个答案:

答案 0 :(得分:2)

您可以为此使用LAG函数

SELECT *
FROM (
    SELECT *
         , LAG(title) OVER (ORDER BY Date) AS prev_title
    FROM t
) AS x
WHERE title <> prev_title

答案 1 :(得分:1)

使用lag()

DEMO

select * from
(
select *, lag(title) over(order by date desc) as prevtitle
from tablename
)A where prevtitle is null or title<>prevtitle

输出:

id  dateval             title   userid
3   29/04/2019 15:17:07   A      1222
4   29/04/2019 16:05:49   B      1048
6   29/04/2019 16:37:16   C      681
7   29/04/2019 16:37:49   D      681
8   29/04/2019 16:38:48   C      681

答案 2 :(得分:1)

使用lead()

select t.*
from (select t.*,
             lead(title) over (order by id) as next_title
      from t
     ) t
where next_title is null or next_title <> title;

您要使用lead(),因为您希望每个组中的 most 个最近值。如果您想要最早的值,可以使用lag()

我不确定是否应该通过iddate列进行排序。对于您的样本数据,它们是等效的。