![](/img/trans.png)
[英]SQL Server query, get records with distinct value in 1 field and max in other field
[英]SQL Server : SELECT query to get DISTINCT and MAX display order value
我有一個產品表、類別表和映射表。 類別另存為類別樹。 如果單個產品已映射到三級層次結構中的最后一個類別。 映射表中保存的所有級別都具有相同的產品 id。
例如:假設有這樣的類別 tre Electronic>LapTops>DELL 並且當產品 id = 1 分配給類別“DELL”映射將保存為 [1,Electronic],[1,LapTops],[1,DELL]
當我通過選擇查詢獲取數據時,所有類別級別都顯示為相同的產品 ID。
我的問題是我需要將數據檢索為 [productId, ProductName, LastCategortLevel, CategoryName, CategoryId]。
參考下面的實際結果。 我只需要選擇具有最高類別訂單級別的最后一個類別級別的突出顯示產品。
我不能使用另一個存儲過程或函數,因為它是大型存儲過程的一小部分。
實際的數據庫表非常大。 但我試圖用小臨時表實現相同的場景。 請參閱以下查詢。
DECLARE @Products TABLE (ProductId INT NOT NULL)
INSERT INTO @Products(ProductId)
SELECT ProductId
FROM (VALUES (1), (2), (3), (4)) as x (ProductId)
DECLARE @Categories TABLE (CategoId INT NOT NULL,
Name VARCHAR(MAX) NOT NULL,
ParentCategoryId INT NOT NULL,
DisplayOrder INT NOT NULL)
-- 1st category tree
INSERT INTO @Categories VALUES (10, 'Electronic', 0, 1)
INSERT INTO @Categories VALUES (11, 'LapTops', 10, 2)
INSERT INTO @Categories VALUES (12, 'DELL', 11, 3)
INSERT INTO @Categories VALUES (13, 'HP', 11, 3)
-- 2st category tree
INSERT INTO @Categories VALUES (14, 'Clothes', 0, 1)
INSERT INTO @Categories VALUES (15, 'T-Shirts', 14, 2)
INSERT INTO @Categories VALUES (16, 'Red', 15, 3)
INSERT INTO @Categories VALUES (17, 'Denim', 14, 2)
INSERT INTO @Categories VALUES (18, 'Levise', 17, 3)
DECLARE @Product_Category_Mappings TABLE(MappingId INT NOT NULL,
ProductId INT NOT NULL,
CategoryId INT NOT NULL)
INSERT INTO @Product_Category_Mappings VALUES (100, 1, 10)
INSERT INTO @Product_Category_Mappings VALUES (101, 1, 11)
INSERT INTO @Product_Category_Mappings VALUES (102, 1, 12)
INSERT INTO @Product_Category_Mappings VALUES (103, 2, 10)
INSERT INTO @Product_Category_Mappings VALUES (104, 2, 11)
INSERT INTO @Product_Category_Mappings VALUES (105, 2, 12)
INSERT INTO @Product_Category_Mappings VALUES (106, 3, 14)
INSERT INTO @Product_Category_Mappings VALUES (107, 3, 15)
INSERT INTO @Product_Category_Mappings VALUES (108, 3, 16)
INSERT INTO @Product_Category_Mappings VALUES (109, 4, 14)
INSERT INTO @Product_Category_Mappings VALUES (110, 4, 17)
INSERT INTO @Product_Category_Mappings VALUES (111, 4, 18)
SELECT *
FROM @Products P
INNER JOIN @Product_Category_Mappings M ON M.ProductId = P.ProductId
INNER JOIN @Categories C ON C.CategoId = M.CategoryId
WHERE M.ProductId = P.ProductId
ORDER BY P.ProductId, C.DisplayOrder
上面腳本的結果。 我如何獲得突出顯示的行?
對於每個ProductId
,您需要具有最高DisplayOrder
的行。 您可以使用窗口函數:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY P.ProductId ORDER BY C.DisplayOrder DESC) rn
FROM @Products P
INNER JOIN @Product_Category_Mappings M ON M.ProductId = P.ProductId
INNER JOIN @Categories C ON C.CategoId = M.CategoryId
WHERE M.ProductId = P.ProductId
) t
WHERE rn = 1
ORDER BY P.ProductId, C.DisplayOrder
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.