如果我的表中的记录与列n_month和n_year匹配,那么如何查询以使用较旧的日期排除记录,并使记录保留最新日期?示例表如下所示:
n_month n_year factor d_expire
===========================================
10 2019 63.2 16-FEB-2018
11 2019 77.6 15-FEB-2018 <-- unwanted
11 2019 82.3 16-FEB-2018
12 2019 58.0 16-FEB-2018
我希望最终得到:
n_month n_year factor d_expire
===========================================
10 2019 63.2 16-FEB-2018
11 2019 82.3 16-FEB-2018
12 2019 58.0 16-FEB-2018
我正在使用的实际表格更复杂,我最终进行了实验,直到我认为这是一个非常复杂的查询,涉及多个UNION和JOIN元素,最终得到我想要的结果,但我是希望我可以用更简单的解决方案替换我的初始(大而丑)解决方案。 SQL不是我的强项,所以我希望有人可以看到这个查询的最简单的解决方案。
谢谢。
答案 0 :(得分:1)
您可以对按日期排序的行进行排名,并删除带有1的行,即具有旧日期的行:
SELECT innerTable.n_month, innerTable.n_year, innerTable.factor, innerTable.d_expire
FROM (
SELECT YourTable.n_month, YourTable.n_year, YourTable.factor,
YourTable.d_expire, RANK() OVER (ORDER BY YourTable.d_expire) AS
Numbering
FROM YourTable
) AS innerTable
WHERE innerTable.Numbering > 1
编辑:如果您可以拥有多个具有最早日期的行,但只有一行可以删除其中一行,那么您可以更改ROW为ROW_NUMBER:
SELECT innerTable.n_month, innerTable.n_year, innerTable.factor, innerTable.d_expire
FROM (
SELECT YourTable.n_month, YourTable.n_year, YourTable.factor,
YourTable.d_expire, ROW_NUMBER() OVER (ORDER BY YourTable.d_expire) AS
Numbering
FROM YourTable
) AS innerTable
WHERE innerTable.Numbering > 1
答案 1 :(得分:0)
你可以在你的where条件中加上一些日期计算
WHERE DATEDIFF(STR_TO_DATE('16.2.2018', '%d.%c.%Y'), STR_TO_DATE(d_expire, '%d-%b-%Y')) <= 0
应该处理您的自定义格式&#34; DAY-MONTHNAME-YEAR&#34; (见https://www.w3schools.com/sql/func_mysql_str_to_date.asp) DATEDIFF计算d_expire日期和给定日期之间的差异(从字符串固定,或CURDATE()表示当前日期等。)