我有兩個表訂單和專案,我需要匹配訂單和專案,匹配由列匹配給出,我需要確保首先訂購的客戶將首先收到專案(最早的預訂日期首先獲得產品)。
此外,公司更喜歡先發送最舊的物品,即最早的生產日期;
實際例子:
訂單表:
| 用戶 | 匹配 | 預訂日期 |
|---|---|---|
| 艾倫 | vz123 | 01/22 |
| 瑪麗亞 | vz123 | 02/22 |
| 道格 | vz123 | 03/22 |
專案表
| item_id | 匹配 | 生產日期 |
|---|---|---|
| X | vz123 | 03/22 |
| 是 | vz123 | 02/22 |
問題是當通過匹配列(專案規格)加入時,我得到 1-N 個結果;
我想要的最終結果是:
| 用戶 | item_id | 預訂日期 | 生產日期 | 匹配 |
|---|---|---|---|---|
| 艾倫 | 是 | 01/22 | 02/22 | vz123 |
| 瑪麗亞 | X | 02/22 | 03/22 | vz123 |
請注意,user 和 item_id 都不會在結果集中出現一次以上,我們根據日期提供偏好;
- 公司更愿意根據預訂日期履行訂單(最早的在先)
- 公司更喜歡根據生產日期銷售物品(“生產截止日期”,最早的在先)
這在 SQL(SQL 服務器、postgres ...)中是否可行?
uj5u.com熱心網友回復:
您可以添加一個視窗函式ROW_NUMBER,以確定訂單的哪一行與商品行相關
您需要解決的一個問題是,您必須標記已處理的行。
CREATE TABLE orders ( "user" VARCHAR(5), "match" VARCHAR(5), "reservation_date" VARCHAR(5) ); INSERT INTO orders ("user", "match", "reservation_date") VALUES ('alan', 'vz123', '01/22'), ('maria', 'vz123', '02/22'), ('doug', 'vz123', '03/22');
CREATE TABLE item ( "item_id" VARCHAR(1), "match" VARCHAR(5), "production_date" VARCHAR(5) ); INSERT INTO item ("item_id", "match", "production_date") VALUES ('X', 'vz123', '03/22'), ('Y', 'vz123', '02/22');
SELECT "user","item_id","reservation_date","production_date",o."match" FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY "match" ORDER BY "reservation_date" ASC) rn FROM orders) o JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY "match" ORDER BY "production_date" ASC) rn FROM item) i ON i."match" = o."match" AND o.rn = i.rn用戶 | item_id | 預訂日期 | 生產日期 | 匹配 :---- | :-------- | :--------------- | :---------------- | :---- 艾倫 | 是 | 01/22 | 02/22 | vz123 瑪麗亞 | X | 02/22 | 03/22 | vz123
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446060.html
標籤:sql sql服务器 PostgreSQL
