寻找没有重复的序列-SQL



第一次出现堆栈溢出。

我需要只使用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 

我使用presto,因为我受while等函数的限制。

非常感谢!

由于我没有办法针对presto进行测试,我不知道这是否真的有效
所以这只是一些标准的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

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

你可以用窗口函数(在presto中可用(来解决它:

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合并为相关日期/时间数据类型中的唯一列。将这些信息分为两列会使其使用更加复杂

这个Db Fiddle中,查询返回:

system|date|nb_records:---------------|:---------------|--------:Word | 2019年8月28日00:00:00|2Excel | 2019年8月28日00:00:00|1Word | 2019年8月28日00:00:00|12019年8月28日00:00:00|2

相关内容

  • 没有找到相关文章

最新更新