当前位置: 首页 > 面试题库 >

如何在SQL中的表中按组填写缺少的日期

曹君墨
2023-03-14
问题内容

我想知道如何使用循环根据sql中各组的开始/结束日期来填充零值缺失日期,以便每个组中都有连续的时间序列。我有两个问题。

  1. 如何为每个组循环播放?
  2. 如何使用每个组的开始/结束日期来动态填写缺少的日期?

我的输入和预期输出如下所示。

输入: 我有一张表A喜欢

date     value      grp_no
8/06/12    1         1
8/08/12    1         1
8/09/12    0         1
8/07/12    2         2
8/08/12    1         2
8/12/12    3         2

我还有一张表B,可用于与A左联接以填写缺少的日期。

date
...
8/05/12
8/06/12
8/07/12
8/08/12
8/09/12
8/10/12
8/11/12
8/12/12
8/13/12
...

如何使用A和B在sql中生成以下输出?

输出:

date     value      grp_no
8/06/12    1         1  
8/07/12    0         1
8/08/12    1         1
8/09/12    0         1
8/07/12    2         2
8/08/12    1         2
8/09/12    0         2
8/10/12    0         2
8/11/12    0         2
8/12/12    3         2

请给我您的代码和建议。提前非常感谢您!!!


问题答案:

您可以像这样不循环

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no
  FROM
(
  SELECT grp_no, date
    FROM
  (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date
      FROM tableA
     GROUP BY grp_no
  ) q CROSS JOIN tableb b 
   WHERE b.date BETWEEN q.min_date AND q.max_date
) p LEFT JOIN TableA a
    ON p.grp_no = a.grp_no 
   AND p.date = a.date

最里面的子查询每组分别获取最小和最大日期。 然后与进行交叉连接,以TableB在每个组的最小-
最大范围内生成所有可能的日期。最后,外部选择将外部联接与一起使用,TableA并用填充value列以0用于缺少的日期TableA

输出:

| DATE | VALUE | GRP_NO |
| ------------ | ------- | -------- |
| 2012-08-06 | 1 | 1 |
| 2012-08-07 | 0 | 1 |
| 2012-08-08 | 1 | 1 |
| 2012-08-09 | 0 | 1 |
| 2012-08-07 | 2 | 2 |
| 2012-08-08 | 1 | 2 |
| 2012-08-09 | 0 | 2 |
| 2012-08-10 | 0 | 2 |
| 2012-08-11 | 0 | 2 |
| 2012-08-12 | 3 | 2 |

这是 SQLFiddle 演示



 类似资料:
  • 问题内容: 我有一个数据框架,如下所示 我想做的是在date列中找到最小和最大日期,并扩展该列使其具有所有日期,同时为该列填写。所以所需的输出是 问题答案: 初始数据框: 首先,将日期转换为日期时间: 然后,生成日期和唯一用户: 这将允许您创建一个MultiIndex: 您可以使用它来重新索引您的DataFrame: 然后可以按用户排序:

  • 问题内容: 我有一个MySQL查询问题,该查询按工作日将表中的数据分组。 我需要它来填充数据中缺少的工作日,例如下面的SQL示例中的星期日(工作日7)。 SQL小提琴 MySQL 5.6模式设置 : 查询1 : 结果 : 我希望它也返回此行。 我的完整查询非常复杂,因此希望您能找到一个快速的解决方案。 问题答案: 正常方法是:

  • 问题内容: 我有一个收藏。 产品浏览 我有一个查询,用于获取特定产品的每日视图。 询问 当前结果 问题 问题是,这种聚合不会在有视图的几天内返回。这会导致数据显示不正确: 结果应该看起来像 PS:最好输入开始和结束日期以基于此范围输出结果 问题答案: 您需要几个额外的步骤来返回默认值。首先,你需要使用与设置为收集所有结果中的一个文件内。然后,您可以将$ map 与一组天作为输入。在其中,您可以使用

  • 问题内容: 我有3个表要合并,每个表都有不同的关注列。我也有一个id变量,我想在id内进行单独的合并。我的想法是,我想按日期(在ID内)合并X,Y和Z,并且如果特定变量不存在该日期,则缺少值。 任何想法如何编写此SQL语句?我尝试弄乱“完全连接”和叉积的where语句,但是我一直在获取某些ID-日期组合(有时甚至没有ID)的重复值。 任何帮助,将不胜感激。 问题答案: 加入可能是棘手的事情。我通常

  • 问题:使用panda——相对于每个组的最小/最大日期值,如何以每月(例如,最后一天索引)频率有效地用零值填充缺失的日期? 编辑不假定输入日期对应于其月份的最后一天。要解决此问题,请在下面的建议答案中添加以下行: 如果没有此修复,用freq='M'填充值可能会导致NA的…! 注:熊猫版本0.24.2 输入示例: 请注意,输入中的日期不一定是其相应月份的第一天或最后一天。 所需输出示例 尝试次数: 以

  • 问题内容: 天哪,它必须是如此简单,但我正在为“填写缺失的数据”问题而苦苦挣扎。 我有一个表,该表具有以下带有一些插入数据的列。 我想要的这张表是从2014年起的全部月份的付款值。 我尝试在select中使用IFNULL,但失败如此严重…而且stackoverflow的搜索结果通常会结合两个或多个表来处理信息。解决这个问题的最快,最好的解决方案是什么? 问题答案: 对于缺少的月份,您可以对所有月份