是否有任何SQL语法可帮助我查找事物是否降序?

一个例子是,如果我想在此表中找到每个驾驶员的driver_ssn,他们的考试分数会在他们参加更多考试时连续降低。

以下示例数据:

Driver_ssn Branch_id Exam_date Exam_type Exam_score
11111111   20       2017-05-25     D         79
11111111   20       2017-12-02     L         67
22222222   30       2016-05-06     L         25
22222222   40       2016-06-10     L         51
22222222   40       2016-08-29     D         81
33333333   10       2017-07-07     L         45
33333333   20       2017-06-27     L         49
33333333   20       2017-07-27     L         61
44444444   10       2017-07-27     L         71
44444444   20       2017-08-30     L         65
44444444   40       2017-09-01     L         62

我没有要发布的查询,因为我是SQL的新手,也不知道从哪里开始。

我使用的版本是8.0.18

yhfhr8100 回答:是否有任何SQL语法可帮助我查找事物是否降序?

还没有测试,但是尝试一下; returns 1111 and 4444 for the sample data

WITH cte AS (
    SELECT driver_ssn,ROW_NUMBER() OVER (PARTITION BY driver_ssn ORDER BY exam_date) AS rn1,ROW_NUMBER() OVER (PARTITION BY driver_ssn ORDER BY exam_score DESC,exam_date) AS rn2
    FROM t
)
SELECT driver_ssn
FROM cte
GROUP BY driver_ssn
HAVING COUNT(CASE WHEN rn1 = rn2 THEN 1 END) = COUNT(*)

基本上,您可以按日期和分数分别为每个驱动程序的行编号。如果有增加日期和减少分数的模式,那么每一行的行号都将相同。

,

是的,有。您可以在查询中使用ORDER BY,请参见以下示例:

SELECT * FROM your-table ORDER BY column-name DESC

希望这会有所帮助!

,

使用LAG将分数与上一个分数进行比较。使用NOT EXISTSNOT IN,显示得分不高于前一次的所有ssn。

select distinct driver_ssn from exams
where driver_ssn not in
(
  select driver_ssn
  from
  (
    select
      driver_ssn,exam_score,lag(exam_score) over (partition by driver_ssn order by exam_date) as prev_exam_score
    from exams
  ) to_compare
  where exam_score >= prev_exam_score
);
,

使用lag()查看上一个得分在更大的位置。然后使用聚合来确保永远不会发生:

select driver_ssn
from (select e.*,lag(exam_score) over (partition by driver_ssn order by exam_date) as prev_exam_score
      from exams e
     ) e
group by Driver_ssn
having sum(prev_exam_score >= exam_score) = 0;

也就是说,在任何情况下,上一门考试分数都不会大于或等于下一门考试分数。

本文链接:https://www.f2er.com/3097259.html

大家都在问