SQL-按最近日期过滤

时间:2018-10-02 08:48:43

标签: sql sql-server

假设我有一张桌子:

SELECT * FROM table;

Ric     Charge     Date
VOD.L   2       20180601
VOD.L   5       20181002
VOD.L   4.5     20180212
RBS.L   3       20180504
RBS.L   6       20180708

如何按日期过滤,以便仅返回最近的费用 例如

Ric     Charge     Date
VOD.L   4.5     20180212
RBS.L   6       20180708

7 个答案:

答案 0 :(得分:1)

我更喜欢简单的前1名

select top 1 * from t order by date desc

在编辑问题时,可以在示例输出错误的情况下使用相关的子查询

select * from t
where t.date in (select max(t1.date) from t t1
                                where t1.Ric=t.Ric
                 )

Demo

Ric     Charge  Date
VOD.L   5.000   02/10/2018 00:00:00
RBS.L   6.000   08/07/2018 00:00:

答案 1 :(得分:0)

类似

SELECT * FROM table WHERE date = (SELECT MAX(date) FROM table)

执行您要的操作(也在多个数据库中)。

Date是SQL中的关键字,并且列名很差。如果可以,请立即更改。如果不能,则可能需要根据您拥有的数据库对其进行引用

答案 2 :(得分:0)

按日期排序,然后使用LIMIT 1仅获得一条记录。

SELECT *
       FROM table
       ORDER BY date DESC
       LIMIT 1;

答案 3 :(得分:0)

具有不等式的自左联接将起作用:

SELECT t1.*
FROM
 table t1
 LEFT JOIN table t2 ON
t1.date < t2.date
WHERE
t2.date IS NULL
GROUP BY
t1.Ric
;

答案 4 :(得分:0)

我将row_number()与tie子句配合使用:

select top (1) with ties t.*
from table t
order by row_number() over (partition by ric order by date desc);

如果日期确定,则可以使用dense_rank()代替row_number()

答案 5 :(得分:0)

您可以使用诸如EXTRACTJSONFIELD之类的窗口函数来创建一个带窗口的订单号,然后您只能提取行号= 1(最新日期)的记录:

ROW_NUMBER

结果:

enter image description here

根据您的问题,当更多行具有相同的Ric / date值时,不清楚会发生什么傻事

答案 6 :(得分:0)

或者,您可以使用不存在。

SELECT * 
FROM TableA AS A
WHERE NOT EXISTS ( SELECT * FROM TableA AS A2
                   WHERE A.Ric = A2.Ric
                     AND A2.Date > A.Date )