【问题标题】:Join back missing date matches加入缺少的日期匹配
【发布时间】:2020-02-18 09:29:35
【问题描述】:

我有下表:

| variable | varDate    | match |
|----------|------------|-------|
| var1     | 15/02/2020 | 98    |
| var1     | 16/02/2020 | 99    |
| var1     | 17/02/2020 | 97    |
| var2     | 15/02/2020 | 95    |

我想为日期 16/02/2020 和 17/02/2020 填充 var2(缺少的日期,如果为 null,则填充值 100)。

我有一个包含过去三天的表格,看起来像这样:

| date       |
|------------|
| 15/02/2020 |
| 16/02/2020 |
| 17/02/2020 |

我的尝试是在 varDate = date 上使用左连接,但这并没有产生我期望的结果,如下所示:

| variable | date       | match |
|----------|------------|-------|
| var1     | 15/02/2020 | 98    |
| var1     | 16/02/2020 | 99    |
| var1     | 17/02/2020 | 97    |
| var2     | 15/02/2020 | 95    |
| var2     | 16/02/2020 | 100   |
| var2     | 17/02/2020 | 100   |

【问题讨论】:

  • 您使用的是哪种 dbms 产品?
  • 我正在使用 SQL Server
  • 考虑到他们标记了tsql暗示 SQL Server @Atk(或sybase,但希望不是)。

标签: sql sql-server tsql date left-join


【解决方案1】:

考虑:

select
    v.variable,
    d.date,
    coalesce(t.match, 100) match
from (select distinct variable from mytable) v
cross join mydates d 
left join mytable t 
    on  t.varDate = d.date
    and t.variable = v.variable

这通过首先cross join将表中可用的variable 的不同值与引用日期的表(我称之为mydates)一起工作。这会生成日期和变量的所有可能组合。

然后,我们用left join 引入原始表(我假设为mytable)。最后,我们使用coalesce() 为缺少的matches 分配一个默认值。

理想情况下,您还应该有一个variables 的参考表,这样就不需要distinct 子查询:

select
    v.variable,
    d.date,
    coalesce(t.match, 100) match
from myvariables v
cross join mydates d 
left join mytable t 
    on  t.varDate = d.date
    and t.variable = v.variable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多