【问题标题】:Finding missing records and missing sequences in SQLite table - where the first entry in the sequence must be 1在 SQLite 表中查找缺失的记录和缺失的序列 - 其中序列中的第一个条目必须是 1
【发布时间】:2021-11-13 21:59:50
【问题描述】:

原问题及解决方法请参考Identifying missing sequences in SQLite table

以下代码正确识别缺失序列,但是,它的起点是基于表中数据的序列中最小的数字。例如,如果序列应该从 1 开始,但数据中的第一个序列以 5 开始,则结果中不包含 1..4。

关于如何使用预定义的开始序列进行测试的任何提示?

SELECT dir, start, stop 
FROM (
  SELECT m.id + 1 start,
    (SELECT MIN(id) - 1 FROM sequence x WHERE x.__dirpath = m.__dirpath AND x.id > m.id) stop, 
     m.__dirpath dir
  FROM sequence m LEFT JOIN sequence r 
  ON m.__dirpath = r.__dirpath AND m.id = r.id - 1
  WHERE r.id IS NULL
) 
WHERE stop IS NOT NULL 
ORDER BY dir, start, stop;

【问题讨论】:

    标签: sqlite sequence common-table-expression missing-data


    【解决方案1】:

    您所要做的就是在数据集中为每个__dirpath 包含1 行,其中id 等于0,前提是表中不存在这样的行,因为最小可能id1
    您可以在 CTE 中使用 UNION ALL
    然后在查询中使用 CTE

    WITH cte AS (
      SELECT __dirpath, id FROM sequence
      UNION ALL
      SELECT DISTINCT __dirpath, '0' FROM sequence 
    )
    SELECT dir, start, stop 
    FROM (
      SELECT m.id + 1 start,
        (SELECT MIN(id) - 1 FROM cte x WHERE x.__dirpath = m.__dirpath AND x.id > m.id) stop, 
         m.__dirpath dir
      FROM cte m LEFT JOIN cte r 
      ON m.__dirpath = r.__dirpath AND m.id = r.id - 1
      WHERE r.id IS NULL
    ) 
    WHERE stop IS NOT NULL 
    ORDER BY dir, start, stop;
    

    请参阅demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多