【问题标题】:Need to pull by date, that a value appears from different tables需要按日期提取,即一个值来自不同的表
【发布时间】:2021-07-10 22:28:12
【问题描述】:

我已经尝试过联合、连接、独特和最小功能并取得了一些成功,但仍然略有偏差。 表格示例如下

ID      date
1            01-02-2020
2            02-02-2020
3            04-06-2020
4            01-03-2019

ID      date
1            01-03-2018
2            07-02-2019
3            10-02-2020
4            09-02-2020

我想要的是

ID  date
1        01-02-2020
2        01-03-2019
3        01-03-2018
4        07-02-2019
5        10-02-2020

【问题讨论】:

    标签: union-all


    【解决方案1】:

    不好看

    但是 MySQL 没有的 Full OUT JOIN 可以解决问题

    CREATE TABLE tab1 (
      `ID` INTEGER,
      `Value_ID` INTEGER,
      `date` VARCHAR(10)
    );
    
    INSERT INTO tab1
      (`ID`, `Value_ID`, `date`)
    VALUES
      ('1', '1', '01-02-2020'),
      ('2', '2', '02-02-2020'),
      ('3', '3', '04-06-2020'),
      ('4', '2', '01-03-2019');
    
    CREATE TABLE tab2 (
      `ID` INTEGER,
      `Value_ID` INTEGER,
      `date` VARCHAR(10)
    );
    
    INSERT INTO tab2
      (`ID`, `Value_ID`, `date`)
    VALUES
      ('1', '3', '01-03-2018'),
      ('2', '4', '07-02-2019'),
      ('3', '5', '10-02-2020'),
      ('4', '4', '09-02-2020');
    
    SELECT COALESCE(t2.`Value_ID`,t1.`Value_ID`) as `Value_ID`,IF (IFNULL(t1.`date`,'31-12-9999') <= t2.`date`,t1.`date`,t2.`date`)
    FROM (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID`) t1 
    right JOIN (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t2 
    ON t1.`Value_ID` = t2.`Value_ID`
    UNION
    SELECT COALESCE(t1.`Value_ID`,t2.`Value_ID`),IF (t1.`date` <= IFNULL(t2.`date`,'31-12-9999'),t1.`date`,t2.`date`)
    FROM (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID`) t1 
    LEFT JOIN (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t2 
    ON t1.`Value_ID` = t2.`Value_ID`
    
    ORDER BY `Value_ID`
    
    值_ID | IF (IFNULL(t1.`date`,'31-12-9999')

    db小提琴here

    你可以使用窗口函数

    架构 (MySQL v8.0)

    CREATE TABLE tab1 (
      `ID` INTEGER,
      `Value_ID` INTEGER,
      `date` VARCHAR(10)
    );
    
    INSERT INTO tab1
      (`ID`, `Value_ID`, `date`)
    VALUES
      ('1', '1', '01-02-2020'),
      ('2', '2', '02-02-2020'),
      ('3', '3', '04-06-2020'),
      ('4', '2', '01-03-2019');
      CREATE TABLE tab2 (
      `ID` INTEGER,
      `Value_ID` INTEGER,
      `date` VARCHAR(10)
    );
    
    INSERT INTO tab2
      (`ID`, `Value_ID`, `date`)
    VALUES
      ('1', '3', '01-03-2018'),
      ('2', '4', '07-02-2019'),
      ('3', '5', '10-02-2020'),
      ('4', '4', '09-02-2020');
    

    查询 #1

    SELECT 
        `Value_ID`, `date`
    FROM
    (SELECT
    `Value_ID`, `date`
    , ROW_NUMBER() OVER (PARTITION BY `Value_ID` ORDER BY `date` ASC) rn
    FROM
    (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID`
    UNION
    SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t1
     ) t3
     WHERE rn = 1;
    
    Value_ID date
    1 01-02-2020
    2 01-03-2019
    3 01-03-2018
    4 07-02-2019
    5 10-02-2020

    View on DB Fiddle

    【讨论】:

    • 感谢您!看起来它会起作用。
    • 如果问这个问题很粗鲁,我很抱歉,但有没有更简单的方法可以做到这一点?我只是问,因为这个答案将由同行评审,如果我把这个发给他们,很明显这不是我的工作。但再次感谢您的帮助!
    • 我添加了另一个版本
    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2021-02-18
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多