我有一個包含三個表的資料庫Customers,Orders并且OrderedProducts. 這些表之間是一對多的關系(一個客戶可以有多個訂單,一個訂單可以包含多個訂購的產品)。每個表在身份列上都有外鍵關系,這樣我就可以像這樣獲取一個客戶的資料:
SELECT
cus.CustomerId, ord.OrderId, orp.ProductId
FROM
Customers cus
INNER JOIN
Orders ord ON cus.CustomerId = ord.CustomerId
INNER JOIN
OrderedProducts orp ON ord.OrderId = orp.OrderId
WHERE
cus.CustomerId = 123
ORDER BY
ord.OrderId, orp.ProductId
輸出:
| 顧客ID | 訂單編號 | 產品編號 |
|---|---|---|
| 123 | 147 | 6 |
| 123 | 147 | 13 |
| 123 | 147 | 18 |
| 123 | 493 | 14 |
| 123 | 493 | 18 |
| 123 | 612 | 2 |
| 123 | 612 | 11 |
| 123 | 612 | 16 |
| 123 | 612 | 23 |
我的問題:重新編號OrderId(在我的查詢中,而不是原始表中)以反映這是客戶的第 1、2、3 等訂單的最簡單方法是什么?換句話說,我不想在上面的查詢中看到“147”、“493”、“612”,而只想看到“1”、“2”、“3”。
我不能只使用ROW_NUMBER(),因為每個OrderId.
有什么建議?現在,假設確切的 SQL 方言無關緊要,我有興趣了解對此的任何看法。謝謝!
uj5u.com熱心網友回復:
WITH CTE(CustomerId, OrderId, ProductId) AS
(
SELECT 123, 147, 6 UNION ALL
SELECT 123, 147, 13 UNION ALL
SELECT 123, 147, 18 UNION ALL
SELECT 123, 493, 14 UNION ALL
SELECT 123, 493, 18 UNION ALL
SELECT 123, 612, 2 UNION ALL
SELECT 123, 612, 11 UNION ALL
SELECT 123, 612, 16 UNION ALL
SELECT 123, 612, 23
)
SELECT
C.CustomerId, C.OrderId, C.ProductId,
DENSE_RANK() OVER (PARTITION BY C.CustomerId ORDER BY C.OrderId ASC) XCOL
FROM
CTE AS C
uj5u.com熱心網友回復:
你確實需要一個 ROW_NUMBER() 但有一個視窗函式!:
SELECT cus.CustomerId,
ROW_number() OVER (
partition by cus.CustomerId, ord.OrderId
order by ord.OrderId)
as order_no, -- magic OVER keyword!
ord.OrderId,
orp.ProductId
FROM Customers cus
INNER JOIN Orders ord
ON cus.CustomerId = ord.CustomerId
INNER JOIN OrderedProducts orp
ON ord.OrderId = orp.OrderId
WHERE cus.CustomerId = 123
ORDER BY ord.OrderId, orp.ProductId
Windows 函式將在回傳記錄的子集上運行一些函式(在這種情況下為 row_number())。子集由partition by和 如果順序很重要,請添加order by.
其實,我錯了。使用 Sergey 的解決方案!以上查詢將添加產品編號,而不是訂單編號。
SELECT cus.CustomerId,
DENSE_RANK() OVER (
partition by cus.CustomerId
order by ord.OrderId)
as order_no, -- order number
ROW_NUMBER() OVER (
partition by cus.CustomerId, ord.OrderId
order by ord.OrderId)
as product_no, -- product number
ord.OrderId,
orp.ProductId
FROM Customers cus
INNER JOIN Orders ord
ON cus.CustomerId = ord.CustomerId
INNER JOIN OrderedProducts orp
ON ord.OrderId = orp.OrderId
WHERE cus.CustomerId = 123
ORDER BY ord.OrderId, orp.ProductId
更多資訊(每個供應商對規范的實作部分都有細微的變化): SQL Server 視窗函式 MySQL 視窗函式 Oracle 分析函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327542.html
標籤:sql
上一篇:sql腳本使用datepart每小時分組并用0填充空
下一篇:識別具有下降趨勢的用戶SQL
