如何从第 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,只能是10 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) &lt; '2018-08-22'? 我摆脱了DATE_SUBmost_recent_release 怎么可能是布尔值? 当我使用 SUM 尝试其他答案时,它返回了一条错误消息,上面写着“未知:SUM(Boolean)”。

以上是关于如何从第 2 列的 BETWEEN(dates) 和第 1 列的 DUPLICATES 中找到 MAX(date)?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中的 LAG 函数

如何在返回 BETWEEN DATE_SUB() 的地方插入日期;

months_between()用法

如何在 Postgres 中对数组列使用 BETWEEN 条件?

sql 语句问题,关于BETWEEN AND 和DATE 的

Oracle 查询 BETWEEN (date) AND (date)