按固定详细程度比较 mySQL 中的日期
Comparing Dates by Fixed Level of Detail in mySQL
早上好,
我正在尝试创建具有以下输出的 mySQL 查询:
为了获得 60_days_since_seen,我需要将当前行的 reference_date 与相对于 unique_identifier 的下一个最近的 reference_date 进行比较并确定如果 reference_date 从该行的 reference_date 开始超过 60 天。
例如:unique_identifier = 123456789
id = 1:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。
id = 2:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。
id = 3:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 超过 60 天,因此 60_days_since_seen 为真(或 1)。
id = 4:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。
id = 5:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。
第一个查询也适用于 mysql 5.x。
第二个使用仅在 mysql 8
中支持的 window 函数
CREATE TABLE datetable (
`Id` INTEGER,
`unique_identifier` INTEGER,
`reference_date` Date
);
INSERT INTO datetable
(`Id`, `unique_identifier`, `reference_date`)
VALUES
('1', '123456789', '2020-01-05'),
('2', '123456789', '2020-02-20'),
('3', '123456789', '2020-06-29'),
('4', '987654321', '2020-02-21'),
('5', '987654321', '2020-03-30');
SELECT
`Id`, `reference_date`
,IF(@unique_identifier = `unique_identifier`,IF(DATEDIFF(`reference_date`,@date) > 60,1,0),1) 60_days_since_seen
,@unique_identifier := `unique_identifier` as 'unique_identifier'
,@date :=`reference_date` 'reference_date'
FROM
(SELECT * FROM datetable ORDER BY unique_identifier,reference_date) t1
,(SELECT @unique_identifier := 0) a,(SELECT @date := NOW()) b
Id | reference_date | 60_days_since_seen | unique_identifier | reference_date
-: | :------------- | -----------------: | ----------------: | :-------------
1 | 2020-01-05 | 1 | 123456789 | 2020-01-05
2 | 2020-02-20 | 0 | 123456789 | 2020-02-20
3 | 2020-06-29 | 1 | 123456789 | 2020-06-29
4 | 2020-02-21 | 1 | 987654321 | 2020-02-21
5 | 2020-03-30 | 0 | 987654321 | 2020-03-30
SELECT
`Id`, `unique_identifier`, `reference_date`,
IF(DATEDIFF(reference_date , LAG(reference_date) OVER (
PARTITION BY unique_identifier
ORDER BY reference_date ))> 60 OR LAG(reference_date) OVER (
PARTITION BY unique_identifier
ORDER BY reference_date ) is NULL,1,0) 60_days_since_seen
FROM datetable
Id | unique_identifier | reference_date | 60_days_since_seen
-: | ----------------: | :------------- | -----------------:
1 | 123456789 | 2020-01-05 | 1
2 | 123456789 | 2020-02-20 | 0
3 | 123456789 | 2020-06-29 | 1
4 | 987654321 | 2020-02-21 | 1
5 | 987654321 | 2020-03-30 | 0
db<>fiddle here
早上好,
我正在尝试创建具有以下输出的 mySQL 查询:
为了获得 60_days_since_seen,我需要将当前行的 reference_date 与相对于 unique_identifier 的下一个最近的 reference_date 进行比较并确定如果 reference_date 从该行的 reference_date 开始超过 60 天。
例如:unique_identifier = 123456789
id = 1:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。
id = 2:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。
id = 3:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 超过 60 天,因此 60_days_since_seen 为真(或 1)。
id = 4:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。
id = 5:由于此 id 之前的 reference_date 发生日期相对于 unique_identifier 距此行的 reference_date 不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。
第一个查询也适用于 mysql 5.x。
第二个使用仅在 mysql 8
中支持的 window 函数CREATE TABLE datetable ( `Id` INTEGER, `unique_identifier` INTEGER, `reference_date` Date ); INSERT INTO datetable (`Id`, `unique_identifier`, `reference_date`) VALUES ('1', '123456789', '2020-01-05'), ('2', '123456789', '2020-02-20'), ('3', '123456789', '2020-06-29'), ('4', '987654321', '2020-02-21'), ('5', '987654321', '2020-03-30');
SELECT `Id`, `reference_date` ,IF(@unique_identifier = `unique_identifier`,IF(DATEDIFF(`reference_date`,@date) > 60,1,0),1) 60_days_since_seen ,@unique_identifier := `unique_identifier` as 'unique_identifier' ,@date :=`reference_date` 'reference_date' FROM (SELECT * FROM datetable ORDER BY unique_identifier,reference_date) t1 ,(SELECT @unique_identifier := 0) a,(SELECT @date := NOW()) b
Id | reference_date | 60_days_since_seen | unique_identifier | reference_date -: | :------------- | -----------------: | ----------------: | :------------- 1 | 2020-01-05 | 1 | 123456789 | 2020-01-05 2 | 2020-02-20 | 0 | 123456789 | 2020-02-20 3 | 2020-06-29 | 1 | 123456789 | 2020-06-29 4 | 2020-02-21 | 1 | 987654321 | 2020-02-21 5 | 2020-03-30 | 0 | 987654321 | 2020-03-30
SELECT `Id`, `unique_identifier`, `reference_date`, IF(DATEDIFF(reference_date , LAG(reference_date) OVER ( PARTITION BY unique_identifier ORDER BY reference_date ))> 60 OR LAG(reference_date) OVER ( PARTITION BY unique_identifier ORDER BY reference_date ) is NULL,1,0) 60_days_since_seen FROM datetable
Id | unique_identifier | reference_date | 60_days_since_seen -: | ----------------: | :------------- | -----------------: 1 | 123456789 | 2020-01-05 | 1 2 | 123456789 | 2020-02-20 | 0 3 | 123456789 | 2020-06-29 | 1 4 | 987654321 | 2020-02-21 | 1 5 | 987654321 | 2020-03-30 | 0
db<>fiddle here