【问题标题】:Finding gaps in sequence numbers查找序列号中的空白
【发布时间】:2021-11-12 11:07:39
【问题描述】:

归结为最简单的术语,我有一个表格的两列表: |PK|序列|

PK 值是域密钥。 SEQ 列表示上游系统提供给我的序列号。不幸的是,上游系统偶尔会错过一个序列项目。例如,我可能会看到:

|PK|序列| |a|0| |一个|1| |a|3|

所以对于域键值 a,我“缺少”序列号 2。 这是我在 Oracle 中第一次尝试 SQL(假设我已经正确转置)。

但它在 Teradata 中不起作用。我收到错误 3807,对象 e1 不存在。

SELECT
    e1.pk,
 
    e1.seq,

    e2.seq
FROM
    my_table   e1,
    my_table   e2
WHERE
    e1.pk = e2.pk
    AND e2.seq = (
        SELECT
            ehash
        FROM
            (
                SELECT
                    e3.pk  ,
                    MIN(e3.seq) AS ehash
                FROM
                    my_table  e3
                WHERE
                    1 = 1
                    AND e3.pk = e1.pk

                    and e3.seq > e1.seq

                    group by e3.pk having min(e3.seq) > e1.seq
            )
    )
    and e2.seq -1 > e1.seq

我认为我的名称范围不正确,但我无法弄清楚。

可能有 OLAP 或其他功能可以帮助我,但我不熟悉它们。因此,如果有更好的方法来满足我的要求,请提出来。

谢谢。

【问题讨论】:

  • 我认为您不能在相关子查询内的派生表中引用您的 e1 表。不是解决方案,但这就是您收到错误的原因。
  • 谢谢,是的,这在某种程度上可以解释它。当然,令人失望。但至少这可以阻止我用头撞墙。

标签: sequence teradata self-join


【解决方案1】:

是的,这很容易用 OLAP / QUALIFY 完成

SELECT pk, seq SEQ1, LEAD(seq) OVER (PARTITION BY pk ORDER BY seq) AS SEQ2
FROM my_table
QUALIFY SEQ2 <> SEQ1+1;

或者如果您想使用相关标量子查询,则将其放入 SELECT 的表达式列表中

SELECT
    e1.pk,
    e1.seq,
                (
                SELECT
                    MIN(e3.seq) AS ehash
                FROM
                    my_table  e3
                WHERE
                     e3.pk = e1.pk
                    and e3.seq > e1.seq
                ) AS seq2
FROM
    my_table   e1
WHERE
    seq2-1 > e1.seq;

【讨论】:

  • 太好了,谢谢。没想到就这样放到表情列表里。聪明的!是的,我怀疑 LEAS 可能是要走的路。你已经说得很清楚了。
猜你喜欢
  • 2013-03-29
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2021-06-27
相关资源
最近更新 更多