如何从第 2 列的 BETWEEN(dates) 和第 1 列的 DUPLICATES 中找到 MAX(date)?
Posted
技术标签:
【中文标题】如何从第 2 列的 BETWEEN(dates) 和第 1 列的 DUPLICATES 中找到 MAX(date)?【英文标题】:How to find MAX(date) from BETWEEN(dates) in column 2 with DUPLICATES in column 1? 【发布时间】:2019-08-22 18:52:58 【问题描述】:我有一个数据库,其中第 1 列中有产品名称,第 2 列中有产品发布日期。我想按发布日期查找“旧”产品。但是,我只对查找至少 1 年前发布的“旧”产品感兴趣。我无法对原始数据库基础架构进行任何编辑。
表格如下所示:
Product| Release_Day
A | 2018-08-23
A | 2017-08-23
A | 2019-08-21
B | 2018-08-22
B | 2016-08-22
B | 2017-08-22
C | 2018-10-25
C | 2016-10-25
C | 2019-08-19
我已经尝试过多个版本的DISTINCT、MAX、BETWEEN、>、
SELECT DISTINCT product,MAX(release_day) as most_recent_release
FROM Product_Release
WHERE
release_day between '2015-08-22' and '2018-08-22'
and release_day not between '2018-08-23' and '2019-08-22'
GROUP BY 1
ORDER BY MAX(release_day) DESC
预期结果不应包含此查询找到的任何产品:
SELECT DISTINCT product,MAX(release_day) as most_recent_release
FROM Product_Release
WHERE
release_day between '2018-08-23' and '2019-08-22'
AND product = A
GROUP BY 1
但是,我完成的每项检查都会返回此日期范围内的产品。
这是初始查询的输出:
Product|Most_Recent_Release
A | 2018-08-23
B | 2018-08-22
C | 2015-10-25
例如,如果我对产品 A 运行检查查询,我会得到:
Product|Most_Recent_Release
A | 2019-08-21
【问题讨论】:
当您已经具有“介于”条件时,添加“and release_day not between '2018-08-23' 和 '2019-08-22”是没有意义的。不需要“不在之间”。 @GTodorov 我只使用了 NOT BETWEEN,因为当我刚刚使用 BETWEEN 时,它无法识别在范围之外发布的同名产品。数据库保留产品名称,但不考虑版本。 @scaisEdge 我相信它显示为 DATETIME 但即将显示为 BOOLEAN。 不可能是BOOLEAN
,只能是1
或0
。
mysql 没有 BOOLEAN
数据类型。你确定你使用的是 MySQL 吗?
【参考方案1】:
使用HAVING
过滤most_recent_release
SELECT product, MAX(release_day) as most_recent_release
FROM Product_Release
GROUP BY product
HAVING most_recent_release < '2018-08-23'
ORDER BY most_recent_release DESC
当您使用 GROUP BY
时,无需使用 DISTINCT
-- 如果每个产品只有一行,则不能重复。
【讨论】:
我使用的平台不允许我使用 DATE_SUB。这是因为第 2 列中的数据类型是 BOOLEAN 吗?合适的替代品会是这样吗?HAVING MAX(release_day) < '2018-08-22'
?
我摆脱了DATE_SUB
。 most_recent_release
怎么可能是布尔值?
当我使用 SUM 尝试其他答案时,它返回了一条错误消息,上面写着“未知:SUM(Boolean)”。以上是关于如何从第 2 列的 BETWEEN(dates) 和第 1 列的 DUPLICATES 中找到 MAX(date)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在返回 BETWEEN DATE_SUB() 的地方插入日期;
如何在 Postgres 中对数组列使用 BETWEEN 条件?