繁体   English   中英

如何通过 SQL 根据某些条件过滤唯一记录

[英]How to filter unique records depending to some condition by SQL

我有一个 SQL 服务器数据库,其中包含一个从考勤设备获取数据的表。

它看起来像这样:

ID 用户身份 日期 时间 指示方向
1988781 25000 2022/01/11 10:02 1
1988782 25000 2022/01/11 10:03 1
1988783 25000 2022/01/11 10:04 1
1988784 25000 2022/01/11 12:30 2
1988785 25000 2022/01/11 12:31 2
1988786 25001 2022/01/11 10:00 1
1988787 25001 2022/01/11 12:30 2
1988788 25002 2022/01/11 10:15 1
1988789 25002 2022/01/11 10:16 1
1988790 25002 2022/01/11 12:19 2

如何过滤每个用户 ID 的数据以使 SignDirection = 1 的时间更短,而 SignDirection = 2 的时间更长?

像是:

ID 用户身份 日期 时间 指示方向
1988781 25000 2022/01/11 10:02 1
1988785 25000 2022/01/11 12:31 2
1988786 25001 2022/01/11 10:00 1
1988787 25001 2022/01/11 12:30 2
1988788 25002 2022/01/11 10:15 1
1988790 25002 2022/01/11 12:19 2

我努力了

select distinct

但没有成功。

您可以计算 2 row_number,向上和向下。
然后过滤它们。

SELECT ID, UserID, [Date], [Time], SignDirection
(
    SELECT *
    , ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time] ASC) rn_asc
    , ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time] DESC) rn_desc
    FROM your_time_and_attendance_table t
) q
WHERE ((SignDirection = 1 AND rn_asc = 1) OR
       (SignDirection = 2 AND rn_desc = 1)) 
ORDER BY ID, UserID, [Date], [Time], SignDirection

@LukStorms 给出的答案很好,但它需要对第二个行号进行另一种排序。

您可以改为使用具有相同排序的LEAD来检测最后一行

SELECT
  ID,
  UserID,
  [Date],
  [Time],
  SignDirection
FROM
(
    SELECT *
    , ROW_NUMBER() OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time]) rn_asc
    , LEAD(Time) OVER (PARTITION BY UserID, SignDirection, [Date] ORDER BY [Time]) nextTime
    FROM YourTable t
) q
WHERE ((SignDirection = 1 AND rn_asc = 1) OR
       (SignDirection = 2 AND nextTime IS NULL)) 
ORDER BY
  ID,
  UserID,
  [Date],
  [Time],
  SignDirection;

db<>小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM