mysql - 在 mySQL 中按固定详细级别比较日期

标签 mysql date partitioning rolling-computation level-of-detail

早上好,

我正在尝试创建一个具有以下输出的 mySQL 查询:

Click here to view desired table output

为了获得 60_days_since_seen,我需要将当前行的引用日期与相对于 unique_identifier 的下一个最近的引用日期进行比较,并确定该引用日期是否距该行的引用日期早于 60 天。

例如:unique_identifier = 123456789

id = 1:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。

id = 2:由于相对于 unique_identifier,此 id 之前的引用日期出现的日期自该行的引用日期以来不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。

id = 3:由于相对于 unique_identifier,此 id 之前的引用日期出现日期自该行的引用日期以来已超过 60 天,因此 60_days_since_seen 为 TRUE(或 1)。

id = 4:由于此实例之前没有日期,因此 60_days_since_seen 为 TRUE(或 1)。

id = 5:由于相对于 unique_identifier,此 id 之前的引用日期出现日期自该行的引用日期以来不到 60 天,因此 60_days_since_seen 为 FALSE(或 0)。

最佳答案

第一个查询也适用于 mysql 5.x。

第二个使用仅在 mysql 8 中支持的窗口函数

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 - 在 mySQL 中按固定详细级别比较日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642713/

相关文章:

php - mysql:从两个表中获取数据取决于第一个表的id和json中的结果

mysql - [HY000][1111]群组功能使用无效

javascript - 如何在 J.T.Sage DateBox 中禁用已选择的下一个日期框的日期

r - 将标题中的日期从 Excel 转换/维护为 R

php - Unix 时间戳转换 PHP - 日期错误

r - 使用 cut2 在 Hmisc 中获得漂亮的切割(没有 [ ) 符号)

php - Mysql 值未在 php 中更新传递给 html 按钮

Redis 流分区

mysql - 需要帮助选择正确的 mysql 数据库分片、集群或分区方法

mysql - 如何从主机连接 MySQL Docker 镜像?