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