[英]In MySQL, select one row out of multiple rows based on condition, otherwise select first row and exclude the rest
我對編寫查詢的 MySQL 感興趣,該查詢查看由 ID 和位置組成的列表。 每個 ID 代表一個獨特的人,可以綁定到多個位置。
我有下表來簡化事情:
+----+----------+
| ID | Location |
+----+----------+
| 1 | Bldg#1 |
| 1 | Bldg#2 |
| 2 | Bldg#3 |
+----+----------+
我希望對上表進行重復數據刪除,以便每個 ID 只得到一行,但我還想為任何給定 ID 添加一個偏好 Bldg#1 的條件。 換句話說,給定一個包含可能具有相同 ID 和多個位置的多行表,我想編寫一個查詢,為每個 ID 輸出 1 行,並且如果與該 ID 關聯的任何行也有 Bldg# 的位置1,我想保留那一行並放棄其余的。 否則,我只想為該 ID 保留一個任意位置行。
對於上表,我希望以下內容作為輸出:
+----+----------+
| ID | Location |
+----+----------+
| 1 | Bldg#1 |
| 2 | Bldg#3 |
+----+----------+
您可以按 id 分組並使用條件聚合:
select id,
case
when max(location = 'Bldg#1') then 'Bldg#1'
else any_value(location)
end location
from tablename
group by id
請參閱演示。
結果:
| id | location |
| --- | -------- |
| 1 | Bldg#1 |
| 2 | Bldg#3 |
您可以將row_number()
與case
表達式一起使用:
select id, location
from (select t.*,
row_number() over (partition by id
order by (case location when 'Bldg#1' then 1 when 'Bldg#2' then 2 when 'Bldg#3' then 3 else 4 end)
) as seqnum
from t
) t
where seqnum = 1;
這不假定任何特定的順序——例如字母順序。
這是你要找的嗎?
例子:
詢問:
DROP TABLE IF EXISTS #TEST
CREATE TABLE #TEST (ID INT, Location NVARCHAR(10))
INSERT INTO #TEST
SELECT 1,'Bldg#1'
UNION
SELECT 1,'Bldg#2'
UNION
SELECT 2,'Bldg#3'
SELECT ID,Location FROM (
SELECT ID,Location, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) AS RNM
FROM #TEST) T
WHERE RNM = 1
內部查詢將確保位置有序,以便 Bldg#1 始終是每個 id 的第一個,因此外部 group by 將選擇第一條記錄
SELECT * FROM
(
SELECT id, location
FROM location
ORDER BY id, location ASC
)a
GROUP BY id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.