基于条件的不同sql多于两列

时间:2018-12-20 09:01:36

标签: mysql sql

下面是表格结构。第一列包含的字符串可能会出现在多行中。我想以这样的方式编写查询: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

的扩展

4 个答案:

答案 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

我确定它会起作用。