我从 SELECT * FROM table ORDER BY tick,refid 得到以下(简化)结果:

tick refid value
----------------
1    1     11
1    2     22
1    3     33
2    1     1111
2    3     3333
3    3     333333

请注意 refid 1(刻度线 3)和 refid 2(刻度线 2 和 3)的“缺失”行

如果可能,我如何使用该 value 的最新先前 refid 进行查询以添加这些缺失的行? “最近”表示与缺失行具有相同 refid 和最大刻度的行的值,使得刻度小于缺失行的刻度。例如
tick refid value
----------------
1    1     11
1    2     22
1    3     33
2    1     1111
2    2     22
2    3     3333
3    1     1111
3    2     22
3    3     333333

附加条件:
  • 所有 refid 的值都在 tick=1。
  • 一个 refid 的顺序可能有很多“缺失”的刻度,(如上 refid 2)。
  • 有很多 refids,不知道哪一个会有稀疏数据。
  • 将有许多超过 3 的刻度,但都是连续的。在正确的结果中,每个 refid 都会有每个刻度的结果。
  • 预先不知道丢失的行 - 这将在多个数据库上运行,所有数据库都具有相同的结构和不同的“丢失”行。

  • 我正在使用 MySQL,现在无法更改 db。随意以另一种方言发布答案,以帮助讨论,但我会选择 MySQL 方言中的答案而不是其他方言。

    是的,我知道这可以在我已经实现的代码中完成。我只是好奇是否可以用 SQL 来完成。

    最佳答案

    当给定的 tick-refid 组合不存在时,应该返回什么 value?在这个解决方案中,我只是返回了给定 refid 的最低值。

    修订版

    我更新了逻辑以确定在 null 的情况下使用什么值。应该注意的是,我假设 ticks+refid 在表中是唯一的。

    Select Ticks.tick
        , Refs.refid
        , Case
            When Table.value Is Null
                Then    (
                        Select T2.value
                        From Table As T2
                        Where T2.refid = Refs.refId
                            And T2.tick =  (
                                            Select Max(T1.tick)
                                            From Table As T1
                                            Where T1.tick < Ticks.tick
                                                And T1.refid = T2.refid
                                            )
                        )
            Else Table.value
            End As value
    From    (
            Select Distinct refid
            From Table
            ) As Refs
        Cross Join  (
                    Select Distinct tick
                    From Table
                    ) As Ticks
        Left Join Table
            On Table.tick = Ticks.tick
                And Table.refid = Refs.refid
    

    10-06 11:13