Mysql 在SQL中对不同的合并列进行排序
我有以下疑问:Mysql 在SQL中对不同的合并列进行排序,mysql,sql,Mysql,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 A, B, C 'ABC', D 几乎每种可能的组合都有变化,但误差仍然存在 那么我怎样才能得到不同的AB
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 A, B, C 'ABC', D
几乎每种可能的组合都有变化,但误差仍然存在
那么我怎样才能得到不同的ABC和D,首先按A值排序,然后按B值排序?(C和D可以保持未排序,并且不必区分,因为ABC组合已经足以指示唯一值)
编辑:
或者,是否可以在不使用DISTINCT的情况下删除基于A列和B列的重复项 应该使用concat进行字符串连接
SELECT DISTINCT CONCAT(A , ' ' , B , ' ', C) AS ABC, D
FROM Table
ORDER BY 1
由于每列中有多个字母单词,因此需要在派生表或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
编辑:基于评论的新方法您是否尝试过分组方式
SELECT (A + ' ' + B + ' ' + C) AS 'ABC', D
FROM Table
ORDER BY A, B
GROUP BY (A + ' ' + B + ' ' + C), D
使用:
请勿使用单引号分隔列名!仅对字符串和日期常量使用单引号。如果您这样做了,您的代码将在第一次运行:
SELECT DISTINCT A + ' ' + B + ' ' + C AS ABC, D
FROM Table
ORDER BY ABC;
您可以在上面看到,第2行(ABD
)排序在一个AXB
行之后,在另一个AXB
行之前,正如order by c1、c2
指定的那样
当您执行选择DISTINCT
操作时,这两个AXB
行将仅成为一行-表示表中两个单独的行,一行排序在ABD
行之前,另一行排序在ABD
行之后
您不能在ABD
之前和之后放置重复的AXB
。这就是为什么
如果选择不同,则“按项目排序”必须出现在“选择”列表中
指定的
多亏了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)”给所有记录一个数字,重复的记录得到一个更大的数字。这允许我过滤顺序为1的记录,以删除所有重复的记录。这样,我可以简单地按原始的3列排序,看到不同不再是查询的一部分。你不能。错误消息完全有意义。例如
'a X'+'C'
=“A'+'X C'
,但您不能按其组件排序。似乎按1排序就可以了…@jarlh但为什么我可以按它的组件排序,而它不是独立的?如果没有独立的,就没有“合并”行,即A、B和C值仍然存在。仍然不是有效的ORDER BY。它很接近,但问题是当值A有两个单词,第一个单词也独立出现时。有意义的是,我更新了我的答案。这应该取决于您使用的SQL语法。它仍然给了我相同的错误“如果指定了select DISTINCT,则ORDER BY items必须出现在选择列表中。”但您的代码启发我自己构造了正确的答案,因此非常感谢:)将其作为答案发布。这不会将字符串作为完整的ABC字符串进行排序吗?(因此,如果字符串A包含两个单词,并且第一个单词出现时没有第二个单词,则会出现问题)@A.bakker根据提示编辑答案。这是您想要的吗?按A和B排序不同于将ABC排序为单个字符串。@A.bakker…这是真的。这是我对您真正想要的内容的猜测。
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
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