2016-06-15 4 views
-1

Ich hatte alle diese Frage teilweise @Gordon Linoff dort mit einer zusätzlichen Anforderungen beantwortet.Wählen Sie die erste Zeile, wo die nächsten 2 Zeilen um +1 erhöhen und (rowVal + 2) durch 3 teilbar ist

Ich möchte die erste Zeile zu finden, wo die nachfolgenden n Zeilen Zuwachswerte von + 1.

CREATE TABLE #Temp 
    ([ID] int, [cct] int) 
; 

INSERT INTO #Temp 
    ([ID], [cct]) 
VALUES 
    (12807, 6), 
    (12813, 12), 
    (12818, 17), 
    (12823, 22), 
    (12824, 23), 
    (12830, 29), 
    (12831, 30), 
    (12832, 31), 
    (12833, 32), 
    (12835, 34), 
    (12837, 36), 
    (12838, 37), 
    (12839, 38), 
    (12840, 39), 
    (12841, 40), 
    (12844, 43), 
    (12846, 45), 
    (12847, 46), 
    (12848, 47), 
    (12849, 48), 
    (12850, 49), 
    (12851, 50), 
    (12854, 53), 
    (12856, 55), 
    (12857, 56), 
    (12860, 59), 
    (12862, 61), 
    (12863, 62), 
    (12864, 63), 
    (12865, 64), 
    (12866, 65), 
    (12871, 70), 
    (12872, 71), 
    (12873, 72) 
; 

@Gordon hat mir schon mit diesem Code die Sequenz ein Teil davon zu finden.

select min(id),min(cct) as cct, count(*) as length 
from (select s.*, (cct - row_number() over (order by id)) as grp 
     from #Temp s 
    ) s 
group by grp 
having count(*) >= 3 

Dies funktioniert perfekt, um die Sequenz zu finden. Wie aus dem Ergebnis ersichtlich ist.

ID cct length 
12830 29 4 
12837 36 5 
12846 45 6 
12862 61 5 
12871 70 3 

aber ich brauche den CCT-Wert innerhalb der Sequenz, die erfüllt (CCT + 2)% 3 = 0

I die Abfrage ID 12838 zurückgeben müssen zu finden, CCT 37, wie dies zuerst CCT-Wert + 2 durch 3 teilbar, wobei die nächsten 2 Zeilenwerte um 1 erhöht werden.

Jede Hilfe wird geschätzt.

+2

Sie haben Glück, dass Sie eine Antwort auf Ihre vorherige Frage erhalten haben. Ihre Fragen sind sehr unklar. Und ich vermute auch, dass deine Frage falsch ist. Dein Titel sagt * teilbar durch 3 *, aber in deinem Post hast du '(cct + 2)% 2 = 0'. Das scheint nicht richtig zu sein. – sstan

+0

Bitte lesen Sie [this] (http://spaghettiba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/) für einige Tipps zur Verbesserung Ihrer Frage. Es ist hilfreich, Datenbankfragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. – HABO

+0

Entschuldigung. Ich habe mehr Code hinzugefügt, um bei der Frage zu helfen. SQLFiddle scheint im Moment nicht verfügbar zu sein, daher konnte ich dort nicht replizieren. Danke für den Tipp. – user1781272

Antwort

0

Ich glaube, ich verstanden habe, was Sie brauchen, versuchen Sie dies: auf

;with 
grp as (-- get the sequences as @Gordon suggested 
    select s.*, (cct - row_number() over (order by id)) as grp 
    from #Temp s 
), 
grp_seq as (-- get the sequence position of each id 
    select *, ROW_NUMBER() over (PARTITION by grp order by cct) n 
    from grp 
), 
grp_min_max as (-- get sequence informations min/max ID, start cct and sequence length, for each group 
    select grp, min(id) min_id, max(id) max_id, min(cct) as cct, count(*) as length 
    from grp_seq s 
    group by grp 
    having count(*) >= 3 
) 
-- finally join all toghether to retrieve your result 
select t1.ID, t1.cct, '--------->' col_sep, t1.n seq_pos, t2.ID ID_cct2, t2.cct cct_div3, t3.* 
from grp_seq t1 
inner join grp_seq t2 on (t1.grp=t2.grp) and (t1.cct = t2.cct-2) and (t2.cct % 3 = 0) 
inner join grp_min_max t3 on t3.grp = t1.grp 
order by id 

es sollte alles, was Sie

ID cct col_sep seq_pos ID_cct2 cct_div3 grp min_id max_id cct length 
12838 37 ---------> 2 12840 39 25 12837 12841 36 5 
12847 46 ---------> 2 12849 48 28 12846 12851 45 6 
12862 61 ---------> 1 12864 63 34 12862 12866 61 5 
12871 70 ---------> 1 12873 72 38 12871 12873 70 3 

bekommen muss ich haben einige zusätzliche Informationen hinzugefügt (afer col_sep Spalte) auf Sequenz Ergebnis Datensatz erwartet, dass ID nicht immer cct + SomeValue sein kann, auf diese Weise wird es Ihnen alle verfügbaren Informationen, abzustreifen, was Sie nicht brauchen.

Ich hoffe, das hilft

Verwandte Themen