我有一張襯衫桌。每個 ID 有多個記錄(多個品牌)。ID 的材質將相同。這些材料與品牌有排名關聯。
材質排名:棉:騎師>耐克>阿迪達斯
任何其他材質:阿迪達斯 > 耐克 > 騎師
對于我的結果,我只想根據上述排名為每個 ID 選擇 1 條記錄。如果 Id 有棉花,我希望在 Jockey 存在的情況下選擇 Jockey 記錄,或者如果 Jockey 不存在,則必須選擇 Nike,如果 Nike 也不存在,則必須選擇 Adidas。
對于任何其他材料,應遵循第二個排名。
襯衫表:
| ID | 品牌 | 材料 | 顏色 | 成本 |
|---|---|---|---|---|
| 1 | 耐克 | 棉布 | 黑色的 | 500 |
| 1 | 騎師 | 棉布 | 藍色的 | 100 |
| 1 | 阿迪達斯 | 棉布 | 紅色的 | 1000 |
| 2 | 騎師 | 合成的 | 橙子 | 20 |
| 2 | 耐克 | 合成的 | 綠 | 2 |
| 3 | 耐克 | 棉布 | 黑色的 | 500 |
| 4 | 耐克 | 羊毛 | 黑色的 | 600 |
| 4 | 騎師 | 羊毛 | 藍色的 | 20000 |
| 4 | 阿迪達斯 | 羊毛 | 紅色的 | 1000 |
結果:
| ID | 品牌 | 材料 | 顏色 | 成本 |
|---|---|---|---|---|
| 1 | 騎師 | 棉布 | 藍色的 | 100 |
| 2 | 耐克 | 合成的 | 綠 | 2 |
| 3 | 耐克 | 棉布 | 黑色的 | 500 |
| 4 | 阿迪達斯 | 羊毛 | 紅色的 | 1000 |
說明:結果表記錄已根據排名選擇。由于 Id 1 有棉花,因此選擇了 Jockey 記錄。由于 Id 2 沒有棉花,因此選擇了 Nike 記錄(根據排名) 由于 Id 3 有棉花,但沒有 Jockey 記錄,因此選擇了下一個等級。由于Id 4沒有棉花,所以選擇了阿迪達斯記錄。
uj5u.com熱心網友回復:
一種方法是使用top(1) with ties
select top(1) with ties *
from tbl
order by row_number() over(partition by id
order by
case Material when 'Cotton' then
case Brand when 'Jockey' then 1
when 'Nike' then 2
when 'Adidas' then 3 end
else
case Brand when 'Adidas' then 1
when 'Nike' then 2
when 'Jockey' then 3 end
end)
uj5u.com熱心網友回復:
想想在現實生活中您將擁有 3 個以上的品牌,使用排名表是可行的。
DECLARE @Rankings TABLE
(
Material VARCHAR(10),
Brand VARCHAR(10),
Ranking INT
);
INSERT @Rankings
(
Material,
Brand,
Ranking
)
VALUES
('Cotton', 'Jockey', 1),
('Cotton', 'Nike', 2),
('Cotton', 'Adidas', 3),
(NULL, 'Adidas', 1),
(NULL, 'Nike', 2),
(NULL, 'Jockey', 3);
DECLARE @Items TABLE
(
Id INTEGER,
Brand VARCHAR(6),
Material VARCHAR(9),
Color VARCHAR(6),
Cost INTEGER
);
INSERT INTO @Items
(
Id,
Brand,
Material,
Color,
Cost
)
VALUES
(1, 'Nike', 'Cotton', 'Black', 500),
(1, 'Jockey', 'Cotton', 'Blue', 100),
(1, 'Adidas', 'Cotton', 'Red', 1000),
(2, 'Jockey', 'Synthetic', 'Orange', 20),
(2, 'Nike', 'Synthetic', 'Green', 2),
(3, 'Nike', 'Cotton', 'Black', 500),
(4, 'Nike', 'Wool', 'Black', 600),
(4, 'Jockey', 'Wool', 'Blue', 20000),
(4, 'Adidas', 'Wool', 'Red', 1000);
WITH ordered
AS (SELECT i.*,
ROW_NUMBER() OVER (PARTITION BY i.Id ORDER BY r.Ranking) orderId
FROM @Items i
INNER JOIN @Rankings r
ON i.Brand = r.Brand
AND
(
(
r.Material = i.Material
AND i.Material = 'Cotton'
)
OR
(
r.Material IS NULL
AND i.Material <> 'Cotton'
)
))
SELECT ordered.Id,
ordered.Brand,
ordered.Material,
ordered.Color,
ordered.Cost
FROM ordered
WHERE ordered.orderId = 1;
uj5u.com熱心網友回復:
您可以使用運算式獲得 (Brand, Material) 的排名CASE,然后您可以將此欄位與最佳排名進行比較,該排名可使用MIN視窗函式獲得。因此檢索以下行ranking = best_ranking:
SELECT Id,
Brand,
Material,
Color,
Cost
FROM (SELECT tab.*,
CASE WHEN Brand = 'Jockey' AND Material = 'Cotton' THEN 1
WHEN Brand = 'Nike' THEN 2
WHEN Brand = 'Adidas' AND Material <> 'Cotton' THEN 1
ELSE 3
END AS ranking,
MIN(CASE WHEN Brand = 'Jockey' AND Material = 'Cotton' THEN 1
WHEN Brand = 'Nike' THEN 2
WHEN Brand = 'Adidas' AND Material <> 'Cotton' THEN 1
ELSE 3
END) OVER(PARTITION BY Id) AS best_ranking
FROM tab ) ranked_brands
WHERE ranking = best_ranking
在這里試試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/478221.html
上一篇:嘗試解決位列的三個條件
