[英]Match data of two rows with different timestamp, into one row (SQL Server)
我遇到了SQL Server查詢問題。
您可以在下面的屏幕快照中看到我數據庫中數據的示例。 包含大數值作為屬性的行實際上是讀卡器讀取的票證的事件。
也有一些行包含像Eticket result
的字符串作為屬性。 當票證無效並且系統顯示票證無效的原因時,將生成此事件。
我想做的是創建一個新列(名稱為“ reason”),其中將包含所有類似於“機票結果”的屬性。 事實是,所有包含“ ETICKET Result”的屬性必須與正確的票證號匹配。 原因屬性和無效票據的時間戳之間的時間差永遠不會超過500毫秒。
為了使其更易於理解,我在下面為您提供了我要執行的操作的另一個屏幕截圖。
有可能做到這一點嗎? 我已經嘗試了幾個小時,並創建了無法生成正確結果的腳本。 如果有幫助,我在下面向您提出查詢,但未顯示正確的數據。
DECLARE @alarm_table TABLE (
/*1*/server_timestamp DATETIME ,
/*2*/museum VARCHAR(255),
/*3*/turnstile VARCHAR(255),
/*4*/entrance VARCHAR(255),
/*5*/cardnumber VARCHAR(255),
/*6*/result VARCHAR(255),
/*7*/reason VARCHAR(255),
/*8*/attributes VARCHAR(255)
);
INSERT INTO @alarm_table
SELECT
/*1*/servertimestamp,
/*2*/hostname,
/*3*/substring([hostname], PatIndex('%[0-9]%', [hostname]), len([hostname])),
/*4*/substring(attributes, 31, 39),
/*5*/attributes,
/*6*/'NOT OK',
/*7*/'',
/*8*/attributes--substring(attributes, 70, 30)
FROM
eventlog el
where
(el.servertimestamp BETWEEN '8/24/2018' AND DATEADD(dd, +1, '8/27/2019'))
and (attributes like '%ticket %' and attributes like '%eticketing%' )
and hostname <> 'tapaeos'
order by
el.timestamp
UPDATE @alarm_table
SET cardnumber = substring(attributes, 31, 39)
UPDATE @alarm_table
SET result = case
when
(attributes like '%ticket 8%'
or attributes like '%ticket 9%'
or attributes like '%ticket 10%'
or attributes like '%ticket 11%'
or attributes like '%ticket 12%'
or attributes like '%ticket 13%'
or attributes like '%ticket 14%'
or attributes like '%knossos ticket 5%'
or attributes like '%knossos ticket 6%'
or attributes like '%knossos ticket 7%'
or attributes like '%klitys ticket 5%'
or attributes like '%klitys ticket 6%'
or attributes like '%klitys ticket 7%'
or attributes like '%olympieio ticket 5%'
or attributes like '%olympieio ticket 6%'
or attributes like '%olympieio ticket 7%'
)
then 'NOT OK'
else 'OK'
end
UPDATE @alarm_table
SET reason = case
when result = 'NOT OK' then
(SELECT top 1 attributes
FROM eventlog
WHERE DATEDIFF(second,servertimestamp,server_timestamp)<=1)
else ' '
end
UPDATE @alarm_table
SET museum = case
when museum like '%olymp%' then 'Olympieio'
when museum like '%knoss%' then 'Knossos'
when museum like '%sslope%' then 'Klitys'
when museum like '%acrop%' then 'Acropolis'
end
select
server_timestamp,
museum,
turnstile,
cardnumber,
result,
reason
-- attributes
from
@alarm_table
order by server_timestamp desc
非常感謝您的幫助,感謝您的寶貴時間。
嘗試這個:
select e1.*, e2.attributes reason
from (
select *
from eventlog
where charindex('ETICKET Result', attributes) = 0
) e1 left join (
select timestamp, attributes
from eventlog
where charindex('ETICKET Result', attributes) > 0
) e2 on abs(datediff(millisecond, e1.timestamp, e2.timestamp)) <= 500
在e1
我們查詢所有正確的記錄(沒有ETICKET Reason
),在e2
我們選擇所有不正確的記錄。 然后,我們將兩個結果以毫秒為單位的時差合並在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.