我有一个包含两列的查询结果,第二列是epoch unix时间的日期。该查询采用日期参数,例如'7/1/2017'
我想要做的是选择与输入日期最近的leaseCode
。因此,在下面的示例中,第一个结果EDMGW | 1533013200000
将比第二个结果更接近“7/1/2017”。
我不希望结果中的第二行EDMGW | 1690779600000
您是SQL专家的想法吗?
LseCode | ExpDate
-------------+---------------
EDMGW | 1533013200000
EDMGW | 1690779600000
CHA08LL | 1496210400000
FRE05LL | 1559282400000
答案 0 :(得分:1)
2017-07-01
)。
SELECT t.*
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY LseCode
ORDER BY ABS(DATEDIFF(S, DATEADD(S, [ExpDate]/1000, '1970-01-01'), '20170701'))) rn
FROM yourTable
) t
WHERE t.rn = 1
在这里演示:
答案 1 :(得分:0)
您可以使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by lsecode order by expdate asc) as seqnum
from t
) t
where seqnum = 1;
对于你的情况,我猜你真的是指最早的ExpDate
。
答案 2 :(得分:0)
DEFINE @param DATE = '07/01/2017';
SELECT TOP 1 leasecode
FROM t WHERE convert(date,dbo.ToDateTime(ExpDate)) <= convert(date,@param)
ORDER BY t.date DESC;
最近的意思是指第一条记录在用户提供日期之前或之前的日期,或者与日期的绝对差异最接近?此外,既然您正在使用DAY,那么您想如何在同一天处理租赁代码? Sry无法测试日期条件,而不是在此刻的机器之前。
/* one row only - with arbitrary resolution of ties absolute dstance */
WITH d AS (
SELECT *,ROW_NUMBER() OVER (ORDER BY
ABS( datediff(day, CONVERT( date, dbo.ToDateTime(ExpDate) ) , convert( date, @param ) ) AS dst FROM t
)
SELECT * FROM d WHERE dst = 1;
/* all rows that with and ExpDate the same number of absolute days from your parameter */
WITH d AS (
SELECT *,DENSE_RANK() OVER (ORDER BY
ABS( datediff(day, CONVERT( date, dbo.ToDateTime(ExpDate) ) , convert( @param , date ) ) ) AS dst FROM t
)
SELECT * FROM d WHERE dst = 1;
答案 3 :(得分:0)
如果您的意思是在 2017-07-01之后,,则可以使用top
和一些dateadd
逻辑将纪元转换为date
用于获取日期差异并将其用于order
结果。
select top 1 with ties lseCode,expDate
from t
where datediff(day,'2017-07-01',dateadd(second, expDate/1000, '1970-01-01')) >= 0
order by datediff(day,'2017-07-01',dateadd(second, expDate/1000, '1970-01-01'))