当前位置: 首页 > 知识库问答 >
问题:

使用sql、spark根据某些条件从表中获取输出

荣俊
2023-03-14
item    value      month     year
A         0          8         2020
B         0          8         2020
A         0          9         2020
B         13          9         2020
A         0          10         2020
B         0          10         2020
A         10          11         2020
B         0          11         2020
A         0          12         2020
B         0          12         2020
A         0          1         2021
B         10          1         2021
A         0          2         2021
B         0          2         2021
A         0          3         2021
B         0          3         2021
A         11          4         2021
B         0          4         2021
item  month   year
A      8       2020
A      12       2020
A      1       2021
B      10       2020
B       2       2021

输出规则:对于一个项目,月,年,我们需要寻找下两个月,如果下两个月的总和(值)为0,那么它将符合输出条件。

对于Exapmle:对于A项,2020年8个月,总和(值)为0至2020年10个月。类似地,对于项目A,2020年9个月的总和(值)在接下来的两个月中是ot 0,所以它将不会产出。

共有1个答案

雷晋
2023-03-14

对于一个项目,月,年,我们需要寻找下两个月,如果和(值)下两个月是0,那么它将合格的输出。

这听起来像lead()或使用窗口框架:

select t.*
from (select t.*,
             sum(value) over (partition by item order by year, month rows between current row and 2 following) as sum_value_3
      from t
     ) t
where sum_value_3;

这将返回比您指定的更多的行,因为您的描述和所需的结果不相同。您确实希望在一行中有3个或更多0的一系列行中的第一行。解决这一问题的一种方法是作为一个缺口和岛屿问题:

select item, year, month, cnt
from (select t.*,
             count(*) over (partition by item, seqnum - seqnum_1) as cnt,
             row_number() over (partition by item, seqnum - seqnum_1 order by year, month) as seqnum_within_group
      from (select t.*,
                   row_number() over (partition by item order by year, month) as seqnum,
                   row_number() over (partition by item, (case when value = 0 then 1 else 0 end) order by year, month) as seqnum_1
            from t
           ) t
      where value = 0
     ) t
where seqnum_within_group = 1 and cnt >= 3;
 类似资料:
  • 问题内容: 我是Java8的新手。我需要根据某些条件(从另一列表中)减去/删除一个列表中的POJO,并将其显示在UI上。 迭代一个列表并搜索条件删除对象将原始列表发送到UI ..主要代码.. 有没有更好的方法来处理循环?任何帮助表示赞赏。 问题答案: 你现在所拥有的代码工作完美,但也因为通过迭代的每一个。改善的一种方法是将每个孩子的存储在中,如果其中包含每个孩子,则将其从中删除:

  • 我有以下数据帧: 我希望获得行ID,其中。 预期收益为。 有什么想法吗?

  • 问题内容: 是否可以将数据从Microsoft Sql Server(以及oracle,mysql等)读取到Spark应用程序中的rdd中?还是我们需要创建一个内存中的集合并将其并行化为RDD? 问题答案: 从邮件列表中找到了解决方案。可以使用JdbcRDD完成此操作。我需要获取MS Sql Server JDBC驱动程序jar并将其添加到项目的lib中。我想使用集成安全性,因此需要将sqljdb

  • 我有以下目录结构: 我想得到以下输出: 我有以下代码(如下),这是低效的,因为它打印出来: 以下是Java代码: 过滤器:

  • 问题内容: 考虑以下两个表 表格1 表2 如何在表2没有表1的ID的情况下从表2将数据插入表1? 换句话说,我想要以下结果: 表2 问题答案: 在你的问题的措辞有点混乱,因为你首先要问 我如何将数据插入 表1 从表2中 但此时你显示了预期的结果 表2 。 现在,如果您想使用table2中不存在的s将table1中的行插入table2中,则可以使用这种方式 这是 SQLFiddle 演示 或者 这是

  • 问题内容: 如果我有一些代码,例如 并且输入文件包含成对的行,我该如何做,以便仅导入每行的第一行?因此,换句话说,每条奇数行都只有?谢谢 问题答案: 您可能想考虑使用来简化奇数行()的过滤。或者在另一种方法中,如果您使用的是JDK7,则可以使用该方法,并在迭代时再次过滤奇数。