假设我有一些数据,例如:
id status activity_date
--- ------ -------------
101 R 2014-01-12
101 Mt 2014-04-27
101 R 2014-05-18
102 R 2014-02-19
请注意,对于 id = 101 的行,我们在 2014-01-12 到 2014-04-26 和 2014-05-18 到当前日期之间有事件。
现在我需要选择 status = 'R' 并且日期是给定日期的最新日期的数据,例如如果我搜索 2014-02-02,我会找到在 2014-01-12 创建的状态行,因为该状态在实体 ID 101 的时间仍然有效。
最佳答案
如果我理解正确的话:
第 1 步:将开始日期和结束日期行转换为列。为此,您必须根据以下条件将表与自身连接起来:
SELECT
dates_fr.id,
dates_fr.activity_date AS date_fr,
MIN(dates_to.activity_date) AS date_to
FROM test AS dates_fr
LEFT JOIN test AS dates_to ON
dates_to.id = dates_fr.id AND
dates_to.status = 'Mt' AND
dates_to.activity_date > dates_fr.activity_date
WHERE dates_fr.status = 'R'
GROUP BY dates_fr.id, dates_fr.activity_date
+------+------------+------------+
| id | date_fr | date_to |
+------+------------+------------+
| 101 | 2014-01-12 | 2014-04-27 |
| 101 | 2014-05-18 | NULL |
| 102 | 2014-02-19 | NULL |
+------+------------+------------+
第 2 步:剩下的就很简单了。将查询包装在另一个查询中并使用适当的 where 子句:
SELECT * FROM (
SELECT
dates_fr.id,
dates_fr.activity_date AS date_fr,
MIN(dates_to.activity_date) AS date_to
FROM test AS dates_fr
LEFT JOIN test AS dates_to ON
dates_to.id = dates_fr.id AND
dates_to.status = 'Mt' AND
dates_to.activity_date > dates_fr.activity_date
WHERE dates_fr.status = 'R'
GROUP BY dates_fr.id, dates_fr.activity_date
) AS temp WHERE '2014-02-02' >= temp.date_fr and ('2014-02-02' < temp.date_to OR temp.date_to IS NULL)
+------+------------+------------+
| id | date_fr | date_to |
+------+------------+------------+
| 101 | 2014-01-12 | 2014-04-27 |
+------+------------+------------+
关于MySQL 选择给定日期位于表中存储的日期之间的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245853/