【问题标题】:SQL Server query to select all records except records repeating in specific time intervalSQL Server查询以选择除在特定时间间隔内重复的记录之外的所有记录
【发布时间】:2017-11-23 14:48:16
【问题描述】:

我想选择表中的所有记录,除了一些在给定时间间隔内为 CustId 重复的记录。

以下是理解需求的简单示例,假设我想跳过相同 CustId 在 60 分钟内重复的记录(60 分钟是时间间隔)。 正如您在下面的数据中看到的,“Cust1”重复第 2 行和第 3 行,“Cust2”重复第 6 行。

+------------------------------------------------+ |身份证 |客户 ID |捕获时间 | +------------------------------------------------+ | 1 | '客户1' | '2017-10-01 10:30' | | 2 | '客户1' | '2017-10-01 10:45' | -- 重复行 | 3 | '客户1' | '2017-10-01 11:35' | -- 重复行 | 4 | '客户1' | '2017-10-01 12:40' | | 5 | 'Cust2' | '2017-10-01 16:15' | | 6 | 'Cust2' | '2017-10-01 17:00' | -- 重复行 | 7 | 'Cust4' | '2017-10-02 08:00' | | 8 | '客户1' | '2017-10-02 10:45' | | 9 | 'Cust3' | '2017-10-02 13:00' | | 10 | 'Cust3' | '2017-10-02 14:05' | +----+----------+---------+

所以结果应该是

+------------------------------------------------+ |身份证 |客户 ID |捕获时间 | +------------------------------------------------+ | 1 | '客户1' | '2017-10-01 10:30' | | 4 | '客户1' | '2017-10-01 12:40' | | 5 | 'Cust2' | '2017-10-01 16:15' | | 7 | 'Cust4' | '2017-10-02 08:00' | | 8 | '客户1' | '2017-10-02 10:45' | | 9 | 'Cust3' | '2017-10-02 13:00' | | 10 | 'Cust3' | '2017-10-02 14:05' | +----+----------+---------+

感谢任何帮助。

【问题讨论】:

  • 您真正使用的是哪个版本的 SQL Sever?
  • 请不要使用不相关的标签。
  • @ZoharPeled 对不起,不相关的标签..我已经删除了那些...

标签: sql-server sql-server-2012


【解决方案1】:

将表加入自身并使用内置函数 Lag

SELECT t1.Id, t1.CastId, t1.capturedtime from Customer t1 INNER JOIN 
(SELECT *,LAG(capturedtime,1,0) OVER(PARTITION BY CastId,CAST(capturedtime as date) ORDER BY CastId,capturedtime) as tempTime FROM Customer) t2
ON t1.Id = t2.Id AND DATEDIFF(MINUTE,tempTime, t1.capturedtime) >= 60

【讨论】:

    【解决方案2】:

    您可以这样做,使用LAG 比较时间

    declare @myt table (id int,custid nvarchar(50),capturedtime datetime
    )
    
    insert into @myt
    values
    ( 1 , 'Cust1', '2017-10-01 10:30'),
    ( 2 , 'Cust1', '2017-10-01 10:45'),
    ( 3 , 'Cust1', '2017-10-01 11:35'),
    ( 4 , 'Cust1', '2017-10-01 12:40'),
    ( 5 , 'Cust2', '2017-10-01 16:15'),
    ( 6 , 'Cust2', '2017-10-01 17:00'),
    ( 7 , 'Cust4', '2017-10-02 08:00'),
    ( 8 , 'Cust1', '2017-10-02 10:45'),
    ( 9 , 'Cust3', '2017-10-02 13:00'),
    ( 10, 'Cust3', '2017-10-02 14:05')
    
    select ID,Custid,CapturedTime from (
    select * ,datediff(MINUTE,odtime,capturedtime) mm from (
    select *,LAG(capturedtime,1,0) over(partition by custid,cast(capturedtime as date )order by custid,capturedtime) as odtime from @myt
    )x
    )z where mm >= 60
    order by id
    

    结果

    【讨论】:

    • 这是正确的假设问题是关于 2012 版本。但是问题中也有 2008 和 2005 版本标签,对于这些版本不存在滞后...
    • 真 :) 让我们看看
    • @Shri 没关系,但我回答 15.03 他回答 16.02 :) 所以基本上我是第一个。但很高兴你让它工作了
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多