【问题标题】:Filling in missing rows in a table填补表格中缺失的行
【发布时间】:2014-08-13 23:02:05
【问题描述】:

起初,我的问题可能看起来很简单,并且以前有人问过。请耐心等待 - 我认为这是一个独特的问题。

表 A 具有列 StateCountyMonthYearRate。每个州、县的组合都以不同的日期和比率多次列出。有些行设置了州和县,而该行中的其他所有内容都为 NULL。

表 B 有每个月和每个年的违约率。列是MonthYearRate。在这张表中,我有几年的默认数据。

因此,对于表 A 中的每个州、县组合,我想用表 B 中的数据填充任何缺失的数据。

我创建了一个表 C,它看起来就像表 A,除了所有数据都用表 B 中的默认数据填充。然后我尝试将表 A 和表 C 合并在一起。但我最终遇到了两个问题。

首先,我得到了重复的行,除了费率外,其他所有内容都相同。在这种情况下,我只想保留最初在表 A 中的行(不是“默认率”)。

其次,我将得到设置了州和县但其他所有内容为 NULL 的行。对于每个默认率,我都需要将这些行替换为行。

所以最后我希望每个州、县、月、年复合材料都有一行。

是否可以像我描述的那样组合表格。

如果您需要任何澄清,请告诉我。谢谢。

表 A 有几千行。每个州、县组合 1 到 48 行:

+-------+--------+--------+------+------+ |状态 |县 |月 |年份 |率 | +-------+--------+--------+------+------+ |纽约 |奥尔巴尼 | 1 | 2011 | ### | |纽约 |奥尔巴尼 | 2 | 2011 | ### | ... |纽约 |奥尔巴尼 | 12 | 2011 | ### | |纽约 |奥尔巴尼 | 1 | 2012 | ### | ... |纽约 |奥尔巴尼 | 12 | 2012 | ### | |纽约 |梦露 | 1 | 2011 | ### | ... |纽约 |梦露 | 12 | 2011 | ### | |纽约 |埃塞克斯 |空 |空 |空 | +-------+--------+--------+------+------+

表 B 有 36 行。 3 年内每个月一行:

+--------+------+------+ |月 |年份 |率 | +--------+------+------+ | 1 | 2011 | *** | | 2 | 2011 | *** | | ... | | | | 12 | 2011 | *** | | 1 | 2012 | *** | | ... | | | | 12 | 2012 | *** | | 1 | 2013 | *** | | ... | | | | 12 | 2013 | *** | +--------+------+------+

结果表的行数比表 A 多。每个州、县组合至少有默认表中的 36 行:

+-------+--------+--------+------+------+ |状态 |县 |月 |年份 |率 | +-------+--------+--------+------+------+ |纽约 |奥尔巴尼 | 1 | 2011 | ### | | ... | | | | | |纽约 |奥尔巴尼 | 12 | 2011 | ### | |纽约 |奥尔巴尼 | 1 | 2012 | ### | | ... | | | | | |纽约 |奥尔巴尼 | 12 | 2012 | ### | |纽约 |奥尔巴尼 | 1 | 2013 | *** | | ... | | | | | |纽约 |奥尔巴尼 | 12 | 2013 | *** | |纽约 |梦露 | 1 | 2011 | ### | | ... | | | | | |纽约 |梦露 | 12 | 2011 | ### | |纽约 |梦露 | 1 | 2012 | *** | | ... | | | | | |纽约 |梦露 | 12 | 2012 | *** | |纽约 |梦露 | 1 | 2013 | *** | | ... | | | | | |纽约 |梦露 | 12 | 2013 | *** | |纽约 |埃塞克斯 | 1 | 2011 | *** | | ... | | | | | |纽约 |埃塞克斯 | 12 | 2011 | *** | |纽约 |埃塞克斯 | 1 | 2012 | *** | | ... | | | | | |纽约 |埃塞克斯 | 12 | 2012 | *** | |纽约 |埃塞克斯 | 1 | 2013 | *** | | ... | | | | | |纽约 |埃塞克斯 | 12 | 2013 | *** | +-------+--------+--------+------+------+

键:*** 是默认表中的比率。 ### 是另一个表中的费率

【问题讨论】:

  • 您能展示一些您尝试过的示例数据和查询吗?有点难以想象你在看什么。
  • 我已经添加了示例表。

标签: mysql sql union


【解决方案1】:

我认为最好的方法是生成地理和时间的所有组合。您可以通过从tablea 获取statecounty 并从tablebyearmonth 交叉连接来执行此操作。然后使用left join查看tablea中是否有值。如果是这样,请选择它。否则,取tableb中的值:

select sc.state, sc.county, ym.year, ym.month, coalesce(a.rate, ym.rate) as rate
from (select distinct state, county from tablea) sc cross join
     tableb ym left outer join
     tablea a
     on a.state = sc.state and a.county = sc.county and
        a.year = ym.year and a.month = ym.month ;

+7 个字符

【讨论】:

  • 你能快速解释一下表 sc 和 ym 是什么吗?
  • 这些是表别名,是作为 SQL 语言导入部分的表名的缩写。
  • sc 是 state-county 的缩写,ym year-month 的缩写,交叉连接将每个 sc 与每个 ym 相乘,所以你最终得到 state- 的总矩阵县-年-月。这是满足这种需求的好方法(对不起,您的需求不是唯一的:)。
  • 但最后一行应为“a.year = ym.year and a.month = ym.month ;” (a.month 与 YM.month 相关)
  • 我做了更正,抱歉不得不添加无用的字符,显然最小有效编辑是 6 个字符。告诉任何 sql 编码器
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多