首页 > 解决方案 > 如何从第 2 列的 BETWEEN(dates) 和第 1 列的 DUPLICATES 中找到 MAX(date)?

问题描述

我有一个数据库,其中第 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

标签: postgresqlduplicatesbetweendate-rangemaxdate

解决方案


用于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

DISTINCT使用时无需使用GROUP BY- 如果每个产品只有一行,则无法重复。


推荐阅读