我目前有兩個表,用戶和優惠券
| ID | 名 |
|---|---|
| 1 | 羅伯塔 |
| 2 | 奧利弗 |
| 3 | 莎娜 |
| 4 | 費欽 |
| ID | 折扣 | 用戶身份 |
|---|---|---|
| 1 | 20% | 1 |
| 2 | 40% | 2 |
| 3 | 15% | 3 |
| 4 | 30% | 1 |
| 5 | 10% | 1 |
| 6 | 70% | 4 |
我想要做的是從優惠券表中選擇,直到我選擇了 X 個用戶。
所以如果我選擇 X = 2 結果表將是
| ID | 折扣 | 用戶身份 |
|---|---|---|
| 1 | 20% | 1 |
| 2 | 40% | 2 |
| 4 | 30% | 1 |
| 5 | 10% | 1 |
我已經嘗試使用兩者dense_rank,row_number但它們回傳每個 user_id 的出現次數而不是它的順序。
SELECT id,
discount,
user_id,
dense_rank() OVER (PARTITION BY user_id)
FROM coupons
我猜我需要在多個子查詢中執行此操作(這很好),其中第一個子查詢將回傳類似
| ID | 折扣 | 用戶身份 | order_of_occurence |
|---|---|---|---|
| 1 | 20% | 1 | 1 |
| 2 | 40% | 2 | 2 |
| 3 | 15% | 3 | 3 |
| 4 | 30% | 1 | 1 |
| 5 | 10% | 1 | 1 |
| 6 | 70% | 4 | 4 |
然后我可以用它來過濾我需要的東西。
PS:我正在使用postgresql。
uj5u.com熱心網友回復:
您已宣告要對查詢進行引數化,以便可以檢索 X 個用戶。我正在閱讀它作為優惠券列 orderuser_id中第一個 X distinct s的所有優惠券。id
看來您的嘗試很接近了。dense_rank()是正確的想法。由于您想查看整個表格,因此您不能使用partition by. 并且還需要一個排序列來確定排名。
with data as (
select *,
dense_rank() over (order by id) as dr
from coupons
)
select * from data where dr <= <X>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463043.html
標籤:sql PostgreSQL
