【问题标题】:Select query eliminating unwanted rows选择查询消除不需要的行
【发布时间】:2021-12-17 06:59:51
【问题描述】:

我是 SQLite 新手,找不到解决方案。

我有 TABLE1 的列 col1col2

col1    col2
-------------
a       no
a       no
a       yes
b       no
c       yes
c       no 
d       yes

我不希望 col1 重复,但在选择“是”时优先 col2

我想要这样的东西

col1    col2
-------------
a       yes
b       no
c       yes
d       yes

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您可以尝试以下方法:

    方法一

    您可以使用row_number 检索由col2 按降序排列的行号,可用于过滤您的结果,例如。

    SELECT
        col1,
        col2
    FROM (
        SELECT
            *,
            ROW_NUMBER() OVER (
                PARTITION BY col1
                ORDER BY col2 DESC
            ) rn
        FROM
            my_table
    ) t
    WHERE rn=1;
    
    col1 col2
    a yes
    b no
    c yes
    d yes

    方法2

    或者简单地使用col1 的组和MAX 函数。 group by 将确保对于每个col1 值,您将收到col2MAX,如果可用,则为yes,否则为no

    SELECT
         col1,
         MAX(col2) as col2
    FROM
        my_table
    GROUP BY
        col1;
    
    col1 col2
    a yes
    b no
    c yes
    d yes

    View working demo on DB Fiddle

    【讨论】:

      【解决方案2】:

      ggordon 的回答会很好,但只是因为窗口函数不是绝对必要的,所以我想我会通过另一个解决方案:

      select distinct 
      a.col1,
      ifnull(b.col2, 'no') col2
      
      from my_table a
      left join (
          select distinct
          col1,
          col2
          from my_table
      
          where col2 = 'yes'
        ) b on a.col1 = b.col1
      

      输出:

      | col1 | col2 |
      | ---- | ---- |
      | a    | yes  |
      | b    | no   |
      | c    | yes  |
      | d    | yes  |
      

      【讨论】:

        【解决方案3】:

        您首先要对第一列进行不同的选择。然后你会想要做一个 case 语句,它本质上是其他语言的 if 语句。如果第 1 列是,则需要返回它。如果不是,则返回否。它看起来像这样

        CASE
            WHEN condition1 THEN result1
            WHEN condition2 THEN result2
            WHEN conditionN THEN resultN
            ELSE result
        END;
        

        【讨论】:

        • 带有 case 语句的 select distinct 将返回 col1 的每个唯一配对和 col2 的条件,这将不满足询问者的要求。
        猜你喜欢
        • 2014-11-17
        • 2022-07-19
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多