SQLZoo白色圣诞节自我加入日期

zthomas.nc

假设我们有一个名为的数据集hadcet,它具有以下格式的历史温度数据:

+------+----+------+------+------+------+------+------+------+------+------+------+------+------+
| yr   | dy | m1   | m2   | m3   | m4   | m5   | m6   | m7   | m8   | m9   | m10  | m11  | m12  |
+------+----+------+------+------+------+------+------+------+------+------+------+------+------+
| 2001 |  1 |   40 |   11 |    9 |  112 |   87 |  131 |  185 |  180 |  150 |  151 |   91 |   98 |
| 2001 |  2 |   77 |   32 |   -4 |  114 |   99 |  126 |  207 |  163 |  168 |  143 |   99 |   29 |
| 2001 |  3 |   52 |   66 |   -3 |   84 |  105 |  100 |  209 |  166 |  153 |  142 |   87 |   55 |
| 2001 |  4 |   50 |   57 |    5 |   69 |   72 |  130 |  219 |  151 |  134 |  139 |   90 |   73 |
| 2001 |  5 |   47 |   68 |   12 |   71 |   82 |  136 |  217 |  161 |  139 |  159 |   75 |   82 |
| 2001 |  6 |   43 |   83 |   57 |   90 |   76 |  135 |  201 |  173 |  141 |  142 |   95 |   46 |
| 2001 |  7 |   49 |   85 |   86 |   69 |   90 |  110 |  185 |  161 |  153 |  128 |  112 |   62 |

以此类推,在1772年至2017年之间的所有日子,月份和年份中。

我们将“白色圣诞节”定义为12月25日的温度小于零。

编写一个查询,以显示一个人在每个出生年份的童年时期遭受白色圣诞节袭击的次数。我们将童年定义为3到12岁(包括3岁和12岁之间),假设他们是在年初出生的,并且在他们的第一个圣诞节大约1岁。仅显示当年出生的孩子经历过7次或更多次白色圣诞节的年份。

我写了以下查询:

SELECT 
    a.yr, 
    COUNT(DISTINCT b.yr) AS wcc
FROM 
    hadcet a
    JOIN hadcet b ON b.yr > a.yr + 2 AND b.yr < a.yr +11
WHERE b.m12 < 0 AND b.dy = 25 
GROUP BY a.yr 
HAVING wcc >= 7 

但是,此问题不会在网页上的SQLZoo编辑器中运行查询(问题4)。这是对这个问题的有效解决方案吗?

专线小巴

这是一个被SQLZoo标记为正确答案的解决方案

SELECT 
    x.yr,
    COUNT(y.yr) wcc
FROM (
    SELECT DISTINCT yr FROM hadcet
) x
LEFT JOIN (
   SELECT yr FROM hadcet WHERE dy >= 21 AND dy <= 25 GROUP BY yr HAVING SUM(m12 < 0) > 0
) y ON y.yr >= x.yr + 2 AND y.yr <= x.yr + 11
GROUP BY x.yr
HAVING COUNT(y.yr) >= 7

该查询使用两个子查询:

  • x 列出不同的年份
  • y 仅选择白色圣诞节年

然后,外部查询使用童年逻辑加入子查询。

注意:您的帖子中给出的“白色圣诞节”的定义与SQLZoo上的定义不符:如果12月21日至25日之间某一天的平均温度低于零,则我们宣布为“白色圣诞节”。您需要使用该规则来获得预期的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章