如何查找具有特定字母但具有相同 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 个结果的主要内容,如果未能解决你的问题,请参考以下文章