[英]Sort Distinct Merged Columns in SQL
我有以下查詢:
SELECT DISTINCT A + ' ' + B + ' ' + C AS 'ABC', D
FROM Table
ORDER BY A, B
這給出了以下錯誤消息:
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
我嘗試將 ORDER By 更改為:
ORDER BY A, B, C 'ABC', D
幾乎所有這些可能的組合都有變化,但錯誤仍然存在。
那么我怎樣才能得到不同的 ABC 和 D 首先按 A 值排序,然后按 B 值排序? (C 和 D 可能保持未排序並且不必是 Distinct 看到 ABC 組合已經足以表示唯一值)
編輯:
或者,是否可以在不使用 DISTINCT 的情況下根據列 A 和 B 刪除重復項?
由於每列中有多個字母單詞,因此您需要使用派生表或 CTE 中的窗口函數進行排序,如下所示:
WITH ordering AS (
SELECT A,
B,
C,
D,
row_number() OVER (ORDER BY A,B,C,D) AS order_num
FROM Table
)
SELECT DISTINCT A + ' ' + B + ' ' + C AS 'ABC', D
FROM ordering
ORDER BY order_num ASC
編輯:基於評論的新方法
您應該使用 concat 進行字符串連接
SELECT DISTINCT CONCAT(A , ' ' , B , ' ', C) AS ABC, D
FROM Table
ORDER BY 1
你有沒有嘗試過分組?
SELECT (A + ' ' + B + ' ' + C) AS 'ABC', D
FROM Table
ORDER BY A, B
GROUP BY (A + ' ' + B + ' ' + C), D
使用WITH 子句:
with a AS (
SELECT A, B, C, concat(A , ' ' , B, ' ', C) AS abc, D
FROM table1 order by A, B, C
)
select distinct abc FROM a ;
不要使用單引號來分隔列名! 僅對字符串和日期常量使用單引號。 如果你這樣做了,你的代碼第一次就可以工作了:
SELECT DISTINCT A + ' ' + B + ' ' + C AS ABC, D
FROM Table
ORDER BY ABC;
SQL>create table t (id int, c1 varchar(3), c2 varchar(3));
SQL>insert into t values (1,'AX','B');
SQL>insert into t values (2,'AB','D');
SQL>insert into t values (3,'A','XB');
SQL>select concat(c1,c2) from t order by c1, c2;
======
AXB
ABD
AXB
3 rows found
您可以在上面看到第 2 行 ( ABD
) 排序在一個AXB
行之后,在另一個AXB
行之前,如order by c1, c2
指定的order by c1, c2
。
當您執行SELECT DISTINCT
,這兩個AXB
行將僅成為一行 - 代表表中的兩個單獨的行,一個在ABD
行之前排序,一個在ABD
行之后排序。
您不能在ABD
之前和之后放置重復消除的AXB
。 這就是為什么
如果指定了 SELECT DISTINCT,則 ORDER BY 項必須出現在選擇列表中。
感謝 Brock 使用“row_number() OVER”的示例,我想到了一種使用 PARTISION BY 自己完成的方法。
WITH ordering AS
(
SELECT
A,
B,
C,
D,
row_number() OVER
(
PARTITION BY
A,
B,
C
ORDER BY
A,
B,
C
) AS order_num
FROM
Table
)
SELECT A + ' ' + B + ' ' + C AS 'ABC', D
FROM ordering
WHERE order_num = 1
ORDER BY A, B, C
這樣,我不使用 DISTINCT,而是使用“row_number() OVER (PARTITION BY”)給所有記錄一個編號,重復項的編號增加。這使我可以過濾 order_num 為 1 以刪除所有重復項。這樣我可以簡單地按原始 3 列排序,看到 Distinct 不再是查詢的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.