假设我们有一个名为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
但是,由于该问题,查询无法在网页上运行in the SQLZoo editor(问题4)。这是解决这个问题的有效方法吗?
答案 0 :(得分:1)
这是一个由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日之间某一天的平均温度低于零,我们将宣布为“白色圣诞节”。 您需要使用该规则来获得预期的结果。