下面是表格结构。第一列包含的字符串可能会出现在多行中。我想以这样的方式编写查询:column1值仅重复一次,以使column2包含A的行优先。如果只有B可用,则输出相同。同样,与此相关的column3也需要打印。如果在Column1和Column2中有多个具有相同值的行,则选择任意(例如:下面的第2行和第3行)。
下面提供了示例数据和预期的sql输出。
表结构(这里也跳过了其他列)
Column1 Column2 Column3
123 A 1
234 A 1
234 A 4
234 B 2
435 A 2
536 B 1
SQL预期输出
Column1 Column2 Column3
123 A 1
234 A 1
435 A 2
536 B 1
注意:这是对此问题Distinct sql based on condition
的扩展答案 0 :(得分:1)
由于您的MySQL版本是8.0,因此我们可以利用Row_Number()
功能。我们可以在Row_Number()
个值的分区中确定Column1
个值,行号1对应于分区中Column2
的最小值。当有多行具有相同的最小Column2
值并且将选择其中任何一个时,这也将处理。
然后我们可以在Derived Table中使用此结果集,并获得行号等于1的行。
SELECT
dt.Column1, dt.Column2, dt.Column3
FROM
(
SELECT
Column1, Column2, Column3,
ROW_NUMBER() OVER (PARTITION BY Column1
ORDER BY Column2 ASC) AS rowno
FROM your_table
) AS dt
WHERE dt.rowno = 1
答案 1 :(得分:1)
您可以尝试以下方法:
SELECT tab.Column1,
tab.Column2,
MIN(tab.Column3)
FROM (SELECT Column1,
MIN(Column2) as min_column2
FROM tab
GROUP BY Column1
) t
JOIN tab
ON tab.Column1 = t.Column1
AND tab.Column2 = t.min_column2
GROUP BY tab.Column1,
tab.Column2;
它是普通的ANSI-SQL,不依赖于数据库或其版本。
答案 2 :(得分:0)
我认为相关子查询是最简单的方法:
select t.*
from t
where (t.column2, t.column3) =
(select column2, column3
from t t2
where t2.column1 = t.column1
order by (column2 = 'A') desc -- put "A" first
limit 1
);
答案 3 :(得分:-2)
您可以尝试
select distinct column1, column2, column3
from tableName
order by column1
我确定它会起作用。