如何查找具有特定字母但具有相同 ID 的最新 2 个结果

Posted

技术标签:

【中文标题】如何查找具有特定字母但具有相同 ID 的最新 2 个结果【英文标题】:How to find latest 2 result with specific alpabet but with same ID 【发布时间】:2020-09-15 20:22:09 【问题描述】:

原始数据

+---------+--------+------------+
|   ID    | STATUS |    DATE    |
+---------+--------+------------+
| ABC1234 | P      | 2020-01-01 |
| ABC1234 | P      | 2020-01-02 |
| ABC1234 | B      | 2020-01-03 |
| ABC1234 | A      | 2020-01-04 |
| ABC1234 | A      | 2020-01-05 |
| BCD     | P      | 2020-01-01 |
| BCD     | P      | 2020-01-02 |
| BCD     | P      | 2020-01-03 |
| BCD     | B      | 2020-01-04 |
| BCD     | A      | 2020-01-05 |
| 12XY    | P      | 2020-01-01 |
| 12XY    | P      | 2020-01-02 |
| 12XY    | P      | 2020-01-03 |
| 12XY    | B      | 2020-01-04 |
| 12XY    | B      | 2020-01-05 |
+---------+--------+------------+

我想要的结果

+-----+--------+------------+
| ID  | STATUS |    DATE    |
+-----+--------+------------+
| BCD | B      | 2020-01-04 |
| BCD | A      | 2020-01-05 |
+-----+--------+------------+

如何找到最新记录Status=A,第二个最新记录Status=B的结果?

在下面尝试过,但仍然不知道如何获取 ID=BCD

select ROW_NUMBER() 
        OVER (PARTITION BY ID ORDER BY date2 DESC) AS rownum
         ,*
         into testingtable
         from mytable
         WHERE status in ('b', 'a')

【问题讨论】:

【参考方案1】:

从子查询中删除 where 子句并使用布尔逻辑:

select t.*
from (select t.*, row_number() over(partition by id order by date desc) as seq
      from table t
      ) t
where (status = 'A' and seq = 1) or (status = 'B' and seq = 2) ;

【讨论】:

【参考方案2】:

如何找到最新记录Status=A和第二最新记录Status=B的结果?

您可以使用窗口函数和一点布尔逻辑:

select id, status, date
from (
    select t.*, row_number() over(partition by status order by date desc) rn
    from mytable t
    where status in ('A', 'B')
) t
where (status = 'A' and rn = 1) or (status = 'B' and rn = 2)

【讨论】:

我不认为partition by status 会做正确的事。通过id,也许?

以上是关于如何查找具有特定字母但具有相同 ID 的最新 2 个结果的主要内容,如果未能解决你的问题,请参考以下文章

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

如何查找 jQuery 中是不是存在具有特定 id 的 div?

如何仅从组中查询具有最新时间戳的文档?

查找具有特定值的最新记录

如何求和具有特定查找字段值的记录数

通过 id mysql 查找具有最新日期的行