簡體   English   中英

在 MySQL 中,根據條件從多行中選擇一行,否則選擇第一行並排除其余行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM