我正在尝试使用以下查询找到倒数第二个日期以获取所有唯一日期。
SELECT DISTINCT CAST(Entrydatetime AS DATE)
FROM [table_name]
返回
2017-11-15
2017-11-16
2017-11-17
2017-11-20
[table_name]包含许多行,其中许多行都在上面列出的相同日期。 (200个记录'2017-11-20',180个记录'2017-11-17'等。)
那么有没有办法从上面的查询中获取第二个到最后一个项目?
如果这是一个数组我可以做'$ array [-2]'
之类的事情所以在这种情况下它会拉2017-11-17。
任何帮助将不胜感激
答案 0 :(得分:2)
您可以使用ROW_NUMBER
对日期进行排名:
select dt
from
(
select distinct
cast(entrydatetime as date) as dt,
row_number() over (order by cast(entrydatetime as date) desc) as rn
from table_name
) ranked
where rn = 2;
答案 1 :(得分:0)
如果使用SQL Server,则可以使用以下查询:
with cte as
(
select DISTINCT Convert(Date,Entrydatetime) ,
ROW_NUMBER() over (order by Convert(Date,Entrydatetime) DESC) as rn
from [table name]
)
select * from cte where rn=2
或者你可以采取另一种方式
SELECT MAX(Convert(Date,Entrydatetime))
FROM [table name]
WHERE Convert(Date,Entrydatetime) < (SELECT MAX(Convert(Date,Entrydatetime) ) FROM [table name])
答案 2 :(得分:0)
以下是使用CTE的示例。我认为迄今为止必须采用DISTINCT EntryDate来消除时间 - 然后应用rownumber。注意我在2017-11-20,12:00:00和13:00:00使用两个不同的时间。如果您在选择中有DISTINCT
,则ORDER BY无法正确执行此操作...此需要子查询。
DECLARE @tablename TABLE (Entrydatetime datetime)
INSERT INTO @tablename VALUES ('2017-11-15 12:00:00')
,('2017-11-16 12:00:00')
,('2017-11-17 12:00:00')
,('2017-11-20 12:00:00')
,('2017-11-20 13:00:00')
;
WITH cte AS
(
SELECT ROW_NUMBER() OVER(ORDER BY EntryDate DESC) [theOrder]
,dT.EntryDate
FROM (
SELECT DISTINCT CAST(Entrydatetime as date) AS EntryDate
FROM @tablename
) AS dT
)
SELECT cte.EntryDate FROM cte WHERE theOrder = 2
提供输出:
EntryDate
2017-11-17