簡體   English   中英

SQL - 如何比較不同行中的兩列?

[英]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 )用於確保enex之間沒有其他行具有退出時間戳。

-- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM