這是我需要根據給定條件獲取三個元素的任務:三個元素:user_id、order_time、ordered_subject
- 每個唯一的 user_id
- 最早的訂單時間
- ordered_subjects 的順序應該是 app-> acc ->ayy
- 如果有幾個order_time相同,你應該只選一門,然后是第三個要求
原表:user_order
| 用戶身份 | 訂單時間 | 有序主題 |
|---|---|---|
| 1 | 2001-02-09 | 應用程式 |
| 2 | 2001-02-09 | 應用程式 |
| 3 | 2001-02-10 | 哎呀 |
| 1 | 2001-02-09 | ACC |
| 1 | 2001-02-10 | 應用程式 |
| 4 | 2001-02-08 | 哎呀 |
| 5 | 2001-02-09 | ACC |
| 5 | 2001-02-09 | 哎呀 |
預期表:
| 用戶身份 | 訂單時間 | 有序主題 |
|---|---|---|
| 1 | 2001-02-09 | 應用程式 |
| 2 | 2001-02-09 | 應用程式 |
| 3 | 2001-02-10 | 哎呀 |
| 4 | 2001-02-08 | 哎呀 |
| 5 | 2001-02-09 | ACC |
我想出了case when和row_number() over的想法,但它不起作用
我試過的代碼:
select
a.uid,
a.subject,
b.min_time,
(case when "app" then 1
when "acc" then 2
when "ayy" then 3
else 4 end) as rn,
row_number() over(partition by
concat(uid,order_id)
order by
rn)
from (
select uid, min(order_time) as min_time
from user_order
group by
uid
) as b
-- join
user_order as a
-- on
where
a.uid = b.uid
and
b.min_time = a.order_time
我應該如何解決這個問題?謝謝:)
uj5u.com熱心網友回復:
您希望每個用戶有一個結果行。對于每個用戶,您想要最早的訂單,如果在最早日期有多個訂單,您更喜歡訂單主題應用程式而不是 acc 和 acc 而不是 ayy。
您想使用ROW_NUMBER,因此按用戶 ID 磁區,按日期排序,并按所需順序排列訂單主題。
select user_id, order_time, ordered_subject
from
(
select
user_id, order_time, ordered_subject,
row_number() over
(partition by user_id
order by order_time,
case ordered_subject
when 'app' then 1
when 'acc' then 2
when 'ayy' then 3
else 4
end) as rn
from mytable
) numbered
where rn = 1
order by user_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468903.html
標籤:sql
上一篇:SQL-比較兩個不同表中的列值
