问题描述
我尝试了联合、连接、不同和最小函数并取得了一些成功,但仍然略有偏差。 表格示例如下
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 |