寻找无重复的序列-SQL

问题描述 投票:1回答:2

第一次堆栈溢出。

我只需要使用SQL查找没有重复的序列。

如果我的数据是(https://i.stack.imgur.com/ZP6Iw.jpg

System   | date | hour
---------+------+-------
Word     | 28/8 | 16:00
Word     | 28/8 | 16:01
Excel    | 28/8 | 16:02
Word     | 28/8 | 16:03
Ppt      | 28/8 | 16:04
Ppt      | 28/8 | 16:05

然后,我的输出将是我使用的系统,但是如果我多次使用一个系统而没有“中间”另一个系统,则该系统将被写入一次。这不是常规的“删除重复项”问题。仅当两个相同的系统一个接一个时才有重复项。

https://i.stack.imgur.com/iG7Cn.jpg

System  | date  
--------+-------
Word    | 28/8
Excel   | 28/8 
Word    | 28/8 
Ppt     | 28/8 

我在限于'while'之类的地方使用presto。

非常感谢!

sql sequence presto gaps-and-islands
2个回答
0
投票

由于我没有办法根据预设进行测试,所以我不知道这是否真的有效。因此,这只是一些标准SQL,它使用LAG窗口函数在同一日期过滤出相同的以下“系统”。

SELECT q.System, q.date
FROM
(
    SELECT 
     t.System, 
     t.date,
     t.hour,
     LAG(t.System) OVER (PARTITION BY t.date ORDER BY t.hour ASC) AS prevSystem
    FROM YourTable t
) AS q
WHERE (q.System != q.prevSystem OR q.prevSystem IS NULL)
ORDER BY q.date, q.hour

0
投票

这是一个孤岛问题。您想对属于同一System的连续记录进行分组。

您可以使用窗口功能(在预设中可用)解决它:

select min(system) system, min(date) date, count(*) nb_records
from (
    select 
        t.*,
        row_number() over(order by date, hour) rn1,
        row_number() over(partition by system order by date, hour) rn2
    from mytable t
) t
group by rn1 - rn2
order by min(rn1)

我强烈建议您将datetime列合并到相关日期/时间数据类型中的唯一列。将这些信息分成两列会使使用起来更加复杂。

[this Db Fiddle中使用示例数据,查询返回:

系统|日期| nb_records:----- | :------------------ | ---------:字| 28/08/2019 00:00:00 | 2Excel | 28/08/2019 00:00:00 | 1个字| 28/08/2019 00:00:00 | 1个Ppt | 28/08/2019 00:00:00 | 2
© www.soinside.com 2019 - 2024. All rights reserved.