Ich muss Paare von Zeilen aus einer Tabelle abhängig von Werten in einer Spalte auswählen. Dies ist meine Quelltabelle:Wählen Sie Paare von Zeilen in SQL (Sollte in SQL Server 2008 und 2012 funktionieren)
EntryID | Code
-----------------
11 | 40
22 | 100
23 | 80
24 | 60
35 | 90
46 | 80
47 | 30
58 | 80
69 | 20
110 | 40
ich nur die Zeilen extrahieren müssen, wo der Code 80 ist und die erste Zeile nach dem Code 80. Das ist also der Ausgang Ich suche:
Code
------
80
60
80
30
80
20
Ich kann dies mit Cursors erreichen, aber meine tatsächliche Tabelle hat 1 Million + Datensätze. Cursor sind also definitiv keine Option.
ich bisher getan haben dies:
declare @currentCode int
declare @rowPtr int
declare @code80row bit
declare @nextRowTaken bit
declare @T1 table (RowNum int, Code int)
declare @Final table (RowNum int, Code int)
set @rowPtr = 1
set @code80row = 0
set @nextRowTaken = 0
insert into @T1 select ROW_NUMBER() over (order by EntryID desc) RowNum, Code from Codes
set @currentCode = (select code from @t1 where RowNum = @rowPtr)
while @currentCode > 0
begin
if @currentCode = 80
begin
set @code80row = 1
set @nextRowTaken = 0
insert into @Final(RowNum, Code) values (@rowPtr, @currentCode)
end
else if (@code80row = 1 and @nextRowTaken = 0)
begin
set @code80row = 0
set @nextRowTaken = 1
insert into @Final(RowNum, Code) values (@rowPtr, @currentCode)
end
set @rowPtr = @rowPtr + 1
set @currentCode = (select code from @t1 where RowNum = @rowPtr)
end
select * from @Final
einen besseren Weg, um dieses Ergebnis zu erhalten, ist es?
EDIT: Nach @ Serg Antwort unten, bevor er die letzte Zeile hinzugefügt, habe ich versucht, diese auch .... Dieses jemand helfen kann mit unterschiedlichen Bedürfnissen:
;with cte as (
select Row_Number() over (order by EntryID) RowNum, entryid, Code from Codes
)
select ft.RowNum, st.RowNum, ft.entryid, st.entryid, ft.Code, st.Code
from cte as ft join cte as st
on ft.code = 80 and ft.RowNum = st.RowNum-1
die gibt:
RowNum |RowNum |entryid |entryid |Code |Code
--------------------------------------------
3 |4 |23 |24 |80 |60
6 |7 |46 |47 |80 |30
8 |9 |58 |69 |80 |20
Gutes Auge, sah nicht die "2008" dort. Aber Sie müssen fügen Sie die "80" Bedingung –
Korrigiert. Danke @Juan – Serg
Vielen Dank @Serg – KSK