基于两列以上条件的不同sql

r1zhe5dt  于 2021-06-15  发布在  Mysql
关注(0)|答案(4)|浏览(369)

下面是表格结构。第一列包含可能出现在多行中的字符串。我希望以这样一种方式编写查询:column1值只重复一次,这样column2包含的行就具有优先权。如果只有b可用,则输出相同。此外,还需要打印相关的第3列。如果在第1列和第2列中有多行具有相同值,请选择任意一行(例如:下面的第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

注意:这是对这个问题的扩展,基于条件的sql

tpxzln5u

tpxzln5u1#

你可以试试

select distinct column1, column2, column3
from tableName
order by column1

我相信它会起作用的。

mgdq6dx1

mgdq6dx12#

由于您的mysql版本是8.0,我们可以利用 Row_Number() 功能。我们可以确定 Row_Number() 分区中的值 Column1 值,行号1对应于 Column2 在隔板上。这也将处理多行具有相同最小值的情况 Column2 它会选择其中任何一个。
然后我们可以在一个派生表中使用这个结果集,得到行号等于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
cczfrluj

cczfrluj3#

你可以试试这个:

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;

它是纯ansisql,不依赖于数据库或其版本。

yzuktlbb

yzuktlbb4#

我认为关联子查询是最简单的方法:

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
       );

相关问题