處理SQL Server項目時,作爲數據導入一部分的要求之一是驗證所有標記的順序是否正確,並且我並不擔心缺少tages。根據數據導入的順序(鍵),我所尋找的應該返回'7010',因爲它是無序的。我知道如何使用其他語言在外部執行此操作,但導入的大小使得這是一個緩慢的過程,並希望找到一種本機SQL方法。如何檢查數字是否無序?
key tag
1 7001
2 7002
3 7004
4 7010
5 7005
6 7006
處理SQL Server項目時,作爲數據導入一部分的要求之一是驗證所有標記的順序是否正確,並且我並不擔心缺少tages。根據數據導入的順序(鍵),我所尋找的應該返回'7010',因爲它是無序的。我知道如何使用其他語言在外部執行此操作,但導入的大小使得這是一個緩慢的過程,並希望找到一種本機SQL方法。如何檢查數字是否無序?
key tag
1 7001
2 7002
3 7004
4 7010
5 7005
6 7006
如果您正在使用SQL Server 2012或更高版本,那麼你可以使用LEAD()
或LAG()
看下一/前一列的鍵值。
SELECT [key]
, tag
FROM
(SELECT
[key],
tag,
LEAD(tag) OVER (ORDER BY [key]) next_tag,
LAG(tag) OVER (ORDER BY [key]) prev_tag
FROM myTable) r
WHERE (tag + 1 <> next_tag AND tag - 1 <> prev_tag)
另外,我從例如兩個7004和7010是失序的信(如果該序列起始於鍵= 1和遞增1)。
如果您使用的是SQL Server 2008R2/2005等,那麼您可以使用雙自連接來獲得相同的結果。
SELECT t.*
FROM myTable t
LEFT JOIN myTable tprev on t.[key] = tprev.[key] + 1
LEFT JOIN myTable tnext on t.[key] = tnext.[key] - 1
WHERE tprev.tag + 1 <> t.tag
AND tnext.tag - 1 <> t.tag
這是您的需求嗎?
DECLARE @tb TABLE([KEY] int,tag INT)
INSERT INTO @tb ([KEY], tag)
VALUES (1,7001),(2,7002),(3,7004),(4,7010),(5,7005),(6,7006)
SELECT * FROM (
SELECT *,LEAD(tag)OVER(ORDER BY [key]) AS n FROM @tb
) AS t
WHERE t.tag>t.n
KEY tag n ----------- ----------- ----------- 4 7010 7005
您正在使用什麼版本的SQL Server? –
您能夠顯示您嘗試執行命令的代碼嗎? –
SQL Server 2015 –