【问题标题】:Select a row from similar rows MYSQL从相似的行MYSQL中选择一行
【发布时间】:2021-05-24 16:05:31
【问题描述】:

我有一张这样的桌子

CREATE TABLE prova
    (`ID` int, `CODCLI` longtext, `RIFYEAR` int, `VAL` int)
;
    
INSERT INTO prova
    (`ID`, `CODCLI`, `RIFYEAR`, `VAL`)
VALUES
    (1, '1dad000', 2020, 150),
    (2, '500', 2020, 100),
    (3, '1dad000', 2021, 50),
    (4, '1dad000', 2022, 70),
    (5, '2000', 2023, 80)
;

http://www.sqlfiddle.com/#!9/7697a4/4 我想选择这些行

2, '500', 2020, 100
3, '1dad000', 2021, 50
4, '1dad000', 2022, 70

我该怎么办?

我写了这样的东西

SELECT * 
  FROM prova 
 WHERE CODCLI IN ('500','1dad000')

但当“RIFYEAR”相同时,我只想选择 CODCLI = 500 的行。

感谢您的帮助;)

【问题讨论】:

    标签: mysql sql select row where-clause


    【解决方案1】:

    一种方法使用窗口函数:

    SELECT p.*
    FROM (SELECT p.*,
                 ROW_NUMBER() OVER (PARTITION BY year ORDER BY CODCLI DESC) as seqnum
          FROM prova p
          WHERE CODCLI IN ('500', '1dad000') 
         ) p
    WHERE seqnum = 1;
    

    保证每年返回一行。

    或者使用NOT EXISTS:

    select p.*
    from prova p
    where p.codcli = '500' or
          (p.codcli = '1dad000' and
           not exists (select 1
                       from prova p2
                       where p2.year = p.year and p2.codcli = '500'
                      )
          );
    

    如果prova 中有重复项,则每年可以返回重复项。

    【讨论】:

    • 第二个很好用,第一个不行,谢谢!
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多