[英]SQL - How to compare two columns in different lines?
這是我的第一個問題。
如何比較不同行中的兩列? 該數據庫是SQL Server 2000。
我在表格中有這些數據:
id entrance exit
----------- ----------------------- -----------------------
10000 2017-06-03 09:07:00.000 NULL
10000 NULL 2017-06-03 11:59:00.000
10000 NULL 2017-06-03 12:31:00.000
10000 2017-06-03 12:25:00.000 NULL
20000 2017-06-03 13:13:00.000 NULL
20000 NULL 2017-06-03 17:39:00.000
我需要驗證入口和出口之間的區別。
例如:在此比較之后,第一個入口(第一行)和第一個出口(第二行)之間的差異在第一個出口(第二行)和下一個入口(第三行)之間進行驗證,依此類推。
我該如何比較這些線? 謝謝!
每行包含入口還是出口都是真的嗎? 如果是,那么我的建議是將這些列合並為一個並使用標志。 您可以考慮將UNION用於此目的。
現在,您可以編寫一個小程序,從第1行到最后一行運行,找到連續行之間的差異。
您需要按照確切的順序制作行ID。
CREATE TABLE #temp
(RowId INT IDENTITY(1,1)
, Id INT
, Entrance DATETIME
, [Exit] DATETIME
)
INSERT #temp VALUES(10000 , '2017-06-03 09:07:00.000', NULL)
INSERT #temp VALUES(10000 , NULL, '2017-06-03 11:59:00.000' )
INSERT #temp VALUES(10000 , NULL ,'2017-06-03 12:31:00.000' )
INSERT #temp VALUES(10000 , '2017-06-03 12:25:00.000', NULL)
INSERT #temp VALUES(20000 , '2017-06-03 13:13:00.000', NULL)
INSERT #temp VALUES(20000 , NULL ,'2017-06-03 17:39:00.000')
SELECT a.RowId
, a.id
, ISNULL(a.entrance, a.[exit]) AS Entrance
, ISNULL(b.[exit], b.Entrance) AS [Exit]
FROM #temp a
LEFT JOIN #temp b
ON b.Id = a.Id
AND b.RowId = a.RowId + 1
如果可能,您可以在id已存在時執行“更新”查詢。 這里的id不是唯一可識別的。
https://www.w3schools.com/sql/sql_update.asp
然后你可以選擇:
select t.exit - t.entrance as difference from table t where t.id="2000"
如果仍然需要每次都插入一個新行,那么在SQL期間生成一個行id,如Wendy在另一個答案中所建議的那樣。
我建議使用以下代碼。 我們的想法是選擇具有非空條目值( en )的所有行,然后將其與具有相同id但具有大於條目時間戳( ex )的退出時間的記錄連接。 最后,左連接( xex )用於確保en和ex之間沒有其他行具有退出時間戳。
-- data stored as per original question
CREATE TABLE #tbl
(
[id] INT NOT NULL,
[entrance] DATETIME,
[exit] DATETIME
);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, '2017-06-03 09:07:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, NULL, '2017-06-03 11:59:00.000');
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, NULL, '2017-06-03 12:31:00.000');
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, '2017-06-03 12:25:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (20000, '2017-06-03 13:13:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (20000, NULL, '2017-06-03 17:39:00.000');
SELECT en.id, en.[entrance], ex.[exit],
DATEDIFF(MINUTE, en.[entrance], ex.[exit]) elapsed_min
FROM #tbl en
JOIN #tbl ex ON en.id=ex.id AND ex.[exit] IS NOT NULL AND ex.[exit] > en.[entrance]
LEFT JOIN #tbl xex ON en.id=xex.id AND xex.[exit] IS NOT NULL
AND xex.[exit] < ex.[exit] AND xex.[exit] > en.[entrance]
WHERE en.entrance IS NOT NULL AND xex.[id] IS NULL;
GO
-- data stored as per comment
CREATE TABLE #tbl2
(
[id] INT NOT NULL,
[type] CHAR(1) NOT NULL,
[timestamp] DATETIME NOT NULL
);
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'E', '2017-06-03 09:07:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'S', '2017-06-03 11:59:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'S', '2017-06-03 12:31:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'E', '2017-06-03 12:25:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (20000, 'E', '2017-06-03 13:13:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (20000, 'S', '2017-06-03 17:39:00.000');
SELECT en.id, en.[timestamp], ex.[timestamp],
DATEDIFF(MINUTE, en.[timestamp], ex.[timestamp]) elapsed_min
FROM #tbl2 en
JOIN #tbl2 ex ON en.id=ex.id AND ex.[type]='S' AND ex.[timestamp] > en.[timestamp]
LEFT JOIN #tbl2 xex ON en.id=xex.id AND xex.[type]='S'
AND xex.[timestamp] < ex.[timestamp] AND xex.[timestamp] > en.[timestamp]
WHERE en.[type]='E' AND xex.[id] IS NULL;
GO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.