簡體   English   中英

在 SQL 中對不同的合並列進行排序

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

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