【问题标题】:filling missing combination in a table在表格中填充缺失的组合
【发布时间】:2020-12-14 01:16:37
【问题描述】:

输入:

item   loc   month    year   qty
 A     DEL    5        2020   12
 A     DEL    6        2020   14
 A     DEL    8        2020   16
 A     DEL    9        2020   17

输出:

item   loc   month    year   qty
 A     DEL    5        2020   12
 A     DEL    6        2020   14
 A     DEL    7        2020   26
 A     DEL    8        2020   16
 A     DEL    9        2020   17
 A     DEL    10       2020   33

说明:

我的输入中没有第 7 个月。因此,为了计算第 7 个月,我将前两个月的数量相加。

例如,第 7 个月的输出将为 12(从第 5 个月开始)+14(从第 6 个月开始)=26

因此,每当缺少任何月份时,我都应该用这个逻辑填充那个月。

【问题讨论】:

  • 输入中有第 6 个月。你是说 7 吗?
  • @GordonLinoff 对不起......是的,我的意思是 7
  • 那么,如果缺少第 7 个月和第 8 个月,我们将根据第 5 个月和第 6 个月计算第 7 个月,然后从第 6 个月计算第 8 个月,并计算第 7 个月的数字?
  • @ThorstenKettner 是的
  • 那么您需要一个迭代过程。 SQL 不是为迭代而设计的。最好改用编程语言。如果要使用 SQL,则需要递归查询。它们似乎不能在 Spark 中直接使用。如果您必须在 SQL 中执行此操作,请查看stackoverflow.com/questions/38904807/…

标签: sql dataframe apache-spark apache-spark-sql


【解决方案1】:

我编写了一个脚本,这是一个两步过程,但它只考虑值之间的缺失月份而不是边界值,即它不会假设 10 缺失,因为它是一个边界值。

第 1 步:为所有其他列插入带有 NULL 的错误月份。

 INSERT INTO TEST_MISSING(MONTH)
 select min_a - 1 + level
     from ( select min(MONTH) min_a
                 , max(MONTH) max_a
              from TEST_MISSING
          )
  connect by level <= max_a - min_a + 1
    minus
   select MONTH
     from TEST_MISSING;

第 2 步:使用延迟填充其他列的值,并使用与其相关的行中的值。

然后使用Window函数计算数量值。

SELECT NVL(ITEM, NEW_ITEM) ITEM, 
     NVL(LOC, NEW_LOC) LOC, 
     MONTH, NVL(YEAR, NEW_YEAR) YEAR,
     CASE WHEN QTY IS NULL THEN SUM(NVL(QTY, 0)) OVER(PARTITION BY NEW_ITEM ORDER BY MONTH ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) ELSE QTY END AS QTY
     FROM (
     SELECT A.*, 
     nvl(item,CASE WHEN ITEM IS NULL THEN (LAG(ITEM) OVER(ORDER BY MONTH)) END) NEW_ITEM,
     nvl(LOC,CASE WHEN LOC IS NULL THEN (LAG(LOC) OVER(ORDER BY MONTH)) END) NEW_LOC,
     nvl(YEAR,CASE WHEN YEAR IS NULL THEN (LAG(YEAR) OVER(ORDER BY MONTH)) END) NEW_YEAR
     FROM TEST_MISSING A) 
     X 
     ORDER BY MONTH;

【讨论】:

  • 我没有这个。
  • 你能不能简单点
  • 你说的简单是什么意思,你无法理解逻辑或者你想一步到位?
  • 你知道火花吗?
  • 我也无法理解你的解决方案......如果你有一些简单的解决方案,比如我可以参考我的输入表本身,然后从中获取输出
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 2019-07-22
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多