【问题标题】:Getting the latest row from status从状态中获取最新行
【发布时间】:2021-03-18 06:24:45
【问题描述】:

假设我有一个包含以下行的表

test_no test_count_no test_status test_run_no
1 0 STOP 1
2 66 FINISH 1
3 67 FINISH 1
4 0 STOP 2
5 0 STOP 2

我需要获取具有test_statusFINISH 并且具有最新的test_no 的行,

例如test_run_no=1,因为FINISH中有two test_status,我只需要获取最新的test_no,即3

如果是test_run_no=2,因为没有test_status=FINISH,我只需要返回第一行。

结果将是:

test_no test_count_no test_status test_run_no
3 67 FINISH 1
4 0 STOP 2

我当前的查询是

SELECT MAX(test_table.test_run_no)
FROM test_table
WHERE test_table.run_status = 'FINISH'
GROUP BY test_table.test_no

知道我应该添加什么查询来获得结果吗?

【问题讨论】:

  • 你使用的是什么 MySQL 版本?
  • 对不起,我正在使用 mariadb,版本是 10.4.14
  • @Beginner 你得到解决方案了吗?

标签: mysql sql mariadb


【解决方案1】:

相关子查询适合此:

select t.*
from test_table t
where t.test_no = (select t2.test_no
                   from test_table t2
                   where t2.test_run_no = t.test_run_no
                   order by (test_status = 'FINISH') desc,
                            (case when test_status = 'FINISH' then test_no end) desc,
                            test_no asc
                  );

order by 为您的条件提供三个键:

  • 'FINISH'放在第一位。
  • 对于'FINISH',获取最大的test_no
  • 对于其他人,请选择最小的。

这个逻辑也可以用row_number()表示:

select t.*
from (select t.*,
             row_number() over (partition by test_run_no
                                order by (test_status = 'FINISH') desc,
                                         (case when test_status = 'FINISH' then test_no end) desc,
                                         test_no asc
                               ) as seqnum
      from test_table t
     ) t
where seqnum = 1;

【讨论】:

    【解决方案2】:

    下面的语句呢:

    select * from test t where t.test_status = 'FINISH'
    and t.test_no = (select max(t1.test_no) from test t1
                     where t1.test_run_no = t.test_run_no)
    union
    select * from test t where t.test_status = 'STOP'
    and not exists (select 1 from test t2 where t2.test_run_no = t.test_run_no
                    and t2.test_status = 'FINISH')
    and t.test_no = (select min(test_no) from test t1
                     where t1.test_run_no = t.test_run_no);
    

    它由两个SELECT 部分组成。在第一部分中,对于具有FINISH 状态的测试,选择具有最高测试编号的测试。 第二部分为没有运行的测试选择最小的测试编号,状态为FINISH

    【讨论】:

      【解决方案3】:

      这就是你要找的东西

      SELECT MAX(test_table.test_run_no) FROM test_table 
      where test_table.run_status = 'FINISH' and test_run_no=1 
      GROUP BY test_table.test_no
      IF @@ROWCOUNT = 0
      BEGIN
        select MAX(test_table.test_run_no) from test_table GROUP BY test_table.test_no
      END
      

      【讨论】:

        【解决方案4】:

        试试看:

        select * from Table_3 where Table_3.test_count_no = (
        select max(test_count_no) from Table_3
        ) and Table_3.test_status = 'FINISH' and Table_3.test_run_no = 1
        union all
        select x.test_no, x.test_count_no, x.test_status, x.test_run_no from
        (select ROW_NUMBER() over (order by Table_3.test_run_no) as rownum, Table_3.* from Table_3 where Table_3.test_run_no = 2) as x where x.rownum = 1
        

        【讨论】:

          【解决方案5】:

          使用 order by desc 并使用 limit 1 来获取确切的行。 像这样

          SELECT *
          FROM test_table
          WHERE test_table.test_status = 'FINISH'
          ORDER BY test_no desc
          LIMIT 1
          

          如果你需要所有的行

          SELECT *
          FROM test_table
          WHERE test_table.test_status = 'FINISH'
          ORDER BY test_no desc
          

          如果你只需要 test_no

          SELECT test_table.test_no
          FROM test_table
          WHERE test_table.test_status = 'FINISH'
          ORDER BY test_no desc
          LIMIT 1
          

          【讨论】:

          • 它只会得到 1 行
          • @Beginner 这就是您所要求的! “我只需要获取最新的 test_no 即 3”,如果您需要所有行,只需删除 'LIMIT 1'
          • @Beginner 你得到解决方案了吗?这个答案不对吗?
          • 对不起,这不是我要找的
          • @Beginner 那么?请解释一下,我可以给你答案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-23
          • 2020-06-10
          • 2019-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-28
          相关资源
          最近更新 更多