我是SQL的新手,我需要一個幫助。
我有一個TAB,我需要為TAB中的任何專案B找到日期最接近的專案A。在這種情況下,A是02.09.2021 04:25:30
| Date. | Item | |
|---|---|---|
| 07.09.2021 05:02:05 | A | 06.09.2021 05:01:02 |
| 06.09.2021 05:01:02>
| 05.09.2021 05:00:02 | 04.09.2021 04:59:01 | 03.09.2021 04:58:03 |
| 03.09.2021 04:58:03 | 02.09.2021 04:56:55 | 02.09.2021 04:33:56 | 02.09.2021 04:25:30 |
uj5u.com熱心網友回復:
WITH CTE(DATE,ITEM)AS>
(
SELECT '20210907 05:02:05' , 'A'UNION ALL
SELECT '20210906 05:01:02' , 'A'UNION ALL
SELECT '20210905 05:00:02' , 'A'UNION ALL
SELECT'20210904 04:59:01' , 'A'UNION ALL
SELECT'20210903 04:58:03' , 'A'UNION ALL
SELECT'20210902 04:56:55' , 'A'UNION ALL
SELECT'20210902 04:33:56' , 'B'UNION ALL
SELECT'20210902 04:25:30' , 'A'
)
SELECT[/span
CAST(C.DATE AS DATETIME)X_DATE,C.ITEM,Q.CLOSEST
FROM CTE AS C
OUTER APPLY
(
SELECT TOP 1 CAST(X.DATE AS DATETIME)CLOSEST
FROM CTE AS X
WHERE X.ITEM='A'AND CAST(X. AS DATETIME)<CAST(C.DATEAS DATETIME)
ORDER BY CAST(X.DATE ASDATETIME) ASC
)Q
WHERE C.ITEM='B'
你可以像上面的查詢一樣使用OUTER APPLY-approach。 也請看一下日期列(DATE)是以符合ISO標準的形式寫的
。uj5u.com熱心網友回復:
你的資料只有兩列。 如果你想得到最接近A的時間戳,那么最快的方法可能是視窗函式:
你的資料只有兩列。
select t.*,
(case when prev_a_date is null then next_a_date
when next_a_date is null then prev_a_date
when datediff(second, prev_a_date, date) <= datediff(second, date, next_a_date) then prev_a_date
else next_a_date
end) as a_date
from (select t.*,
max(case when item= 'A'/span> then date end) over (order by date) as prev_a_date,
min(case when items = 'A'/span> then date end) over (order by date desc) as next_a_date
from t
) t
where item = 'B'/span>;
這使用秒來測量時間差,但如果合適的話,你可以使用一個更小的單位。
如果你有更多的來自 "A "行的列,你也可以用apply來做這個:
select tb.*, ta.*
from t b outer apply
(select top (1) ta.*
from t ta.
where item = 'A'/span>
order by abs(dateiff(second, a.date, b.date)
) t
where item = 'B'/span>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/334021.html
標籤:
上一篇:需要根據重量百分比來計算成本
下一篇:使用來自JSON的值連接表
