gpt4 book ai didi

mysql - 涉及连续值的棘手 SQL 查询

转载 作者:可可西里 更新时间:2023-11-01 06:33:38 26 4
gpt4 key购买 nike

我需要执行一个相对容易解释但(鉴于我的技能有限)难以编写的 SQL 查询。

假设我们有一个类似于这个的表:

 exam_no | name | surname | result | date
---------+------+---------+--------+------------
1 | John | Doe | PASS | 2012-01-01
1 | Ryan | Smith | FAIL | 2012-01-02 <--
1 | Ann | Evans | PASS | 2012-01-03
1 | Mary | Lee | FAIL | 2012-01-04
... | ... | ... | ... | ...
2 | John | Doe | FAIL | 2012-02-01 <--
2 | Ryan | Smith | FAIL | 2012-02-02
2 | Ann | Evans | FAIL | 2012-02-03
2 | Mary | Lee | PASS | 2012-02-04
... | ... | ... | ... | ...
3 | John | Doe | FAIL | 2012-03-01
3 | Ryan | Smith | FAIL | 2012-03-02
3 | Ann | Evans | PASS | 2012-03-03
3 | Mary | Lee | FAIL | 2012-03-04 <--

请注意,exam_nodate 不一定相关,正如人们从我选择的那种示例中所期望的那样。

现在,我需要做的查询如下:

  • 从最近的考试 (exam_no = 3) 中找到所有失败的学生 (John Doe, Ryan Smith玛丽·李).
  • 对于这些学生中的每一个,找到第一批连续失败考试的日期。另一种表达方式是:为这些学生中的每一个找到他们最后一次通过考试后第一次失败考试的日期。 (查看表中的箭头)。

结果表应该是这样的:

 name | surname | date_since_failing
------+---------+--------------------
John | Doe | 2012-02-01
Ryan | Smith | 2012-01-02
Mary | Lee | 2012-03-04

如何执行这样的查询?

感谢您的宝贵时间。

最佳答案

您可以利用这样一个事实,即如果有人通过了最近的考试,那么他们自最近一次通过以来就没有未通过任何考试:因此问题减少到发现自最近一次通过以来第一次考试失败:

SELECT   name, surname, MIN(date) date_since_fail
FROM results NATURAL LEFT JOIN (
SELECT name, surname, MAX(date) lastpass
FROM results
WHERE result = 'PASS'
GROUP BY name, surname
) t
WHERE result = 'FAIL' AND date > IFNULL(lastpass,0)
GROUP BY name, surname

查看 sqlfiddle .

关于mysql - 涉及连续值的棘手 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com