2016-05-26 8 views
0

Ich bin wirklich auf ein Problem stecken in Bezug auf herauszufinden, ob es einen Unterschied zwischen zwei columns. Row value ist wie folgt:Stuck Finding Kombination Unterschiede

Serial  code 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A1 
D03L30225 A2 

so sagen, wenn es einen anderen Eintrag wie A2 am Ende war, ist es eine Möglichkeit Kombination seriell/Code Unterschied zu wissen.

Ich habe versucht, Windows-Funktionen wie partition und rank ohne Erfolg

Danke

+3

(1) Ihre Frage bearbeiten und die Ergebnisse liefern Sie möchten (die Frage nicht klar ist). (2) Ist Ihnen klar, dass SQL-Tabellen * ungeordnete * Mengen darstellen? Es gibt keine Reihenfolge für die Zeilen, außer eine Spalte gibt die Reihenfolge an. –

+0

Möchten Sie die doppelten Einträge finden? – bmsqldev

+0

Hallo, ich möchte eine dritte Spalte hinzufügen und finden, wo es eine Änderung von der vorherigen gab. Die dritte Spalte ist tatsächlich ein Indikator für eine Änderung in der Kombination von Serial- und Code-Spalten – abs786123

Antwort

1

Dies sollte für Sie arbeiten. Eine Sache zu beachten ist, dass Sie nach etwas bestellen müssen. Vielleicht stimmt das, was ich bestellt habe, nicht für dich, aber du brauchst etwas.

IF OBJECT_ID('tempdb..#Test', 'U') IS NOT NULL DROP TABLE #Test; 

create table #Test 
(
    Serial varchar(10), 
    code char(2) 
) 

insert into #Test values ('D03L30225', 'A1') 
insert into #Test values ('D03L30225', 'A1') 
insert into #Test values ('D03L30225', 'A1') 
insert into #Test values ('D03L30225', 'A2') 

; 
with cte as 
(
    select rownum = row_number() over (order by Serial, code), Serial, code 
    from #Test 
) 

select curr.Serial, curr.code, 
case 
    when curr.code <> prev.code then 
     1 
    else 
     0 
end as 'DifferenceFlag' 
from cte curr 
left join cte prev on prev.rownum = curr.rownum - 1 

Wenn Sie SQL Server 2012 oder höher verwenden könnten Sie die LAG-Funktion verwenden. Wir sind immer noch auf SQL Server 2008 R2. Also musste ich vor kurzem etwas Ähnliches machen. Ich fand die Methode, die ich oben verwendet habe here.

0

nach Ihren Kommentar, ich nehme an, dass Sie eine weitere Spalte third_column zu Ihrer Tabelle hinzugefügt werden soll, und legen Sie Wert für diese Spalte entsprechend der Änderung des Paares Serial,Code

Wenn das stimmt, könnten Sie verwenden:

ALTER TABLE 
    table_name 
ADD 
    third_column numeric(18,0); 

UPDATE t 
SET t.third_column = t1.rwn 
FROM table_name AS t 
INNER JOIN 
    (select 
     serial, code 
     ,row_number() over (order by serial, code) - 1 as rwn 
    from 
     table_name 
    group by 
     serial, code 
    order by 
     serial, code 
    ) AS t1 
ON 
    t.serial = t1.serial and t.code = t1.code; 
0

Ich könnte den Code etwas anders schreiben. Die erste Abfrage unten listet nur die Codes mit mehr als einer Seriennummer auf. Und die zweite wird eine ganze Gruppe von Codes markieren, wo innerhalb dieses Codes mehrere Seriennummern enthalten sind.

Die anderen angebotenen Lösungen geben Ihnen eine korrekte Zeilennummer. Auf jeden Fall weiß ich nicht, ob das helfen wird, aber viel Glück!

select 
code, 
count(distinct serial) cnt_serial 
from table 
group by code 
having 
count(distinct serial) > 1 

ODER

select 
code, 
serial, 
case when count(distinct serial) over (partition by code) > 1 then 'Y' end fl_code_has_dup 
from table