【问题标题】:Looking for sequences without duplicates - SQL寻找没有重复的序列 - SQL
【发布时间】:2019-10-27 04:08:31
【问题描述】:

第一次堆栈溢出。

我需要仅使用 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?
  • 来自sql标签的描述:问题应该包括代码示例、表结构、示例数据和DBMS实现的标签(例如MySQL、PostgreSQL、Oracle、MS SQL服务器、IBM DB2 等)正在使用。如果您的问题仅与特定 DBMS(使用特定扩展/功能)有关,请改用该 DBMS 的标签。您的问题似乎缺少代码示例、表结构和 DBMS 特定标签。
  • 我使用 presto(通过超集),它似乎受到限制。 Thr 表结构如图所示为 3 个字段:系统、日期、小时。样本数据在那里。代码示例:很遗憾,我还是没有。
  • 您有订购栏目吗?
  • 我第一次注意到一个带有 presto 标签的问题。从this documentation 看来,presto 使用了接近标准 SQL 的东西。有趣的是,这让我想起了以前工作中的一个旧 IBM 软件,它充当了 informix 数据库的 SQL 代理。

标签: sql sequence presto gaps-and-islands


【解决方案1】:

由于我无法针对 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

【讨论】:

  • 非常感谢,我会尽力让您知道的!不知道这个功能。
  • 好吧,他们并没有真正提供有关 Windows 功能 here 的大量文档。所以我只能假设它应该工作。 ;)
【解决方案2】:

这是一个孤岛问题。您想要对属于同一 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 合并到相关日期/时间数据类型中的唯一列。将此信息拆分为两列会使使用起来更加复杂。

this Db Fiddle 和您的示例数据中,查询返回:

系统 |日期 | nb_records :----- | :----------------- | ---------: 词 | 28/08/2019 00:00:00 | 2 电子表格 | 28/08/2019 00:00:00 | 1 词 | 28/08/2019 00:00:00 | 1 ppt | 28/08/2019 00:00:00 | 2

【讨论】:

  • 非常感谢!我改用了“铅”,它起作用了!
  • @Ded:欢迎!我会推荐 accepting the answer 你觉得最有用的。
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多