微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要按日期提取,不同表中出现一个值

如何解决需要按日期提取,不同表中出现一个值

我尝试了联合、连接、不同和最小函数并取得了一些成功,但仍然略有偏差。 表格示例如下

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

解决方法

不好看

但是 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','01-03-2019');
CREATE TABLE tab2 (
  `ID` INTEGER,`date` VARCHAR(10)
);

INSERT INTO tab2
  (`ID`,'01-03-2018'),'4','07-02-2019'),'5','10-02-2020'),'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'),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`
Value_ID | IF (IFNULL(t1.`date`,t2.`date`)
-------: | :-------------------------------------------------------------------
       1 | 01-02-2020                                                          
       2 | 01-03-2019                                                          
       3 | 01-03-2018                                                          
       4 | 07-02-2019                                                          
       5 | 10-02-2020                                                          

dbfiddle here

您可以使用窗口函数

架构(MySQL v8.0)

CREATE TABLE tab1 (
  `ID` INTEGER,'01-03-2019');
  CREATE TABLE tab2 (
  `ID` INTEGER,'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 日期
1 01-02-2020
2 01-03-2019
3 01-03-2018
4 07-02-2019
5 10-02-2020

View on DB Fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。