如何查询过滤不需要的记录?

时间:2018-02-16 18:40:38

标签: sql

如果我的表中的记录与列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不是我的强项,所以我希望有人可以看到这个查询的最简单的解决方案。

谢谢。

2 个答案:

答案 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()表示当前日期等。)