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

时间:2019-02-03 18:07:53

标签: sql

假设我们有一个名为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)。这是解决这个问题的有效方法吗?

1 个答案:

答案 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日之间某一天的平均温度低于零,我们将宣布为“白色圣诞节”。 您需要使用该规则来获得预期的结果。