[英]How to compare a date from outer query with date in inner query using MYSQL?
我有客戶、工作、訂單和日期作為列。 客戶可以對每個作業有多個訂單,當然也可以在給定特定日期范圍內進行多個作業。
我想做的是弄清楚在特定日期范圍內有多少“新”訂單。 也就是說,如果一個作業有 5 個訂單,它應該只返回 1 個訂單。 這是一個簡短的數據庫表示例、所需結果以及到目前為止我一直在嘗試使用的查詢。
+-------+-------+---------+------------+
| CusID | JobID | OrderNo | OrderDate |
+-------+-------+---------+------------+
| 1 | 10 | 25 | 2021-12-22 |
| 1 | 10 | 26 | 2022-02-09 |
| 3 | 5 | 28 | 2022-01-10 |
| 3 | 6 | 29 | 2022-01-11 |
+-------+-------+---------+------------+
有 4 行訂單及其關聯的JobID
。 查詢應返回 2 行,因為訂單 25 和訂單 26 都與JobID
10 關聯,只有 1 行可以算作“新”,而OrderNo
25 不在外部查詢日期范圍內。
這是我嘗試使用的查詢,基於日期>=
到今年的第一天。 我希望能夠使用外部查詢中的OrderDate
與內部查詢中的OrderDate
進行比較。 如果有一個JobID
的OrderDate
小於當前行的OrderDate
該訂單不是新的並且應該返回JobID
,從而使內部查詢為假並過濾掉該行。
SELECT * FROM orders
WHERE OrderDate >= '2022-01-01'
AND JobID NOT IN
(SELECT JobID FROM orders WHERE inner.OrderDate < outer.OrderDate)
預期結果
| 3 | 5 | 28 | 2022-01-10 |
| 3 | 6 | 29 | 2022-01-11 |
使用row_number
對每個作業的訂單進行排名。 把它放在子查詢中,只接受
最新
的最舊的? 每個作業的順序。
select custid, jobid, orderNo, orderDate
from (
select
*,
row_number() over ( partition by jobid order by orderDate asc ) as oldest
from orders
) a
where a.oldest = 1
and orderDate >= '2022-01-01'
您的查詢正朝着正確的方向前進,您只需要將別名應用於外表,以便它是唯一可識別的 -
SELECT *
FROM orders `outer`
WHERE OrderDate >= '2022-01-01'
AND JobID NOT IN
(SELECT JobID FROM orders WHERE OrderDate < `outer`.OrderDate);
根據您的時間范圍內包含的行數以及每個作業的平均訂單數,您可能希望先匯總 -
SELECT *
FROM (
SELECT JobID, MIN(OrderDate) AS MinOrderDate
FROM orders
WHERE OrderDate >= '2022-01-01'
GROUP BY JobID
) o
WHERE JobID NOT IN
(SELECT JobID FROM orders WHERE OrderDate < o.MinOrderDate);
假設一項工作可能在一個日期有多個訂單,您可能需要考慮使用 OrderNo 而不是 OrderDate 進行比較 -
SELECT *
FROM orders `outer`
WHERE OrderDate >= '2022-01-01'
AND JobID NOT IN
(SELECT JobID FROM orders WHERE OrderNo < `outer`.OrderNo);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.