2016-07-14 4 views
0

Ich habe eine große Aktivität ziehen, wo ich die letzte Aktivität von ausgewählten ca.Matter_Key's in einer Tabelle erhalten, bestimmt durch ca.activity_key (Tabellen Primärschlüssel). Ich würde gerne wissen, die effizienteste Art, dies zu erreichen, da das Endergebnis im Baseballstadion von 20K sein wird.Max von zwei Spalten, innerhalb der gefundenen Menge

select distinct 

    ca.matter_key, 
    ca.activity_key, 
    ca.actrow1, 
    ca.actrow2, 
    ca.actrow3, 
    ca.actrow4 

    FROM CaseAct ca 

    where 
    ca.matter_key in (
    4945046, 
    5040953, 
    5025296, 
    5078360 
    ) 

Das Ergebnis von oben wird das unten stehende Ergebnis geben:

Matter_key activity_key actrow1 actrow2 actrow3 actrow4 
4945046  12   Data Data Data Data  
4945046  13   Data Data Data Data  
4945046  14   Data Data Data Data  
5040953  35   Data Data Data Data  
5040953  36   Data Data Data Data  
5025296  77   Data Data Data Data  
5025296  78   Data Data Data Data  
5025296  79   Data Data Data Data  
5078360  NULL   Data Data Data Data  
4887024  93   Data Data Data Data  
4887024  94   Data Data Data Data  
4887024  95   Data Data Data Data  
5061591  NULL   Data Data Data Data  

Und ich brauche:

Matter_key activity_key actrow1 actrow2 actrow3 actrow4 
4945046  14   Data Data Data Data  
5040953  36   Data Data Data Data  
5025296  79   Data Data Data Data  
5078360  NULL   Data Data Data Data  
4887024  95   Data Data Data Data  
5061591  NULL   Data Data Data Data 

ich das auf der vorherigen Sätze unter Verwendung einer Kombination von Gruppe von ca getan haben .matter_key und Max (ca.activity_key) unter Verwendung von Kriterien, jedoch brauche ich die vorausgewählten matter_keys, was eine große Liste ist. Ist Where in ca.activity_key() der effizienteste Weg, diese Liste zu erstellen?

Danke für jede Hilfe!

+1

Wo sind 'Matter_key'' '4887024'' und' 5061591'' gekommen? om ...? Ihre Abfrage filtert bereits nach der Spalte "Matter_key", und diese sind nicht in der Abfrage enthalten. – Siyual

+0

Entschuldigung, ich löschte manuell Zeilen für die Lesbarkeit, sie müssen hochgefegt worden sein. – rattacat

Antwort

2

können Sie row_number() verwenden:

select ca.* 
from (select ca.*, 
      row_number() over (partition by matter_key order by activity_key desc) as seqnum 
     from CaseAct ca 
     where ca.matter_key in (4945046, 5040953, 5025296, 5078360) 
    ) ca 
where seqnum = 1; 
+0

Frage bevor ich renne: warum CA. * auswählen und nicht ca.atter_key, ca.activity_key, ca.actrow1, ..? Ich frage, weil es eine sehr breite (und weitgehend ineffiziente) DB ist. – rattacat

+1

Wenn Sie alle Spalten von Ca auswählen, wie in Ihrer Frage gezeigt, ist es egal – TheGameiswar

+0

Ah, ich verstehe. Entschuldigung, ich habe im Beispiel nur eine bestimmte Anzahl von Spalten angegeben, da sie meiner Meinung nach nicht im Mittelpunkt der Frage standen. Die eigentliche Select-Abfrage ist ungefähr 20 Spalten und die Tabelle ist ungefähr 120 (wie zuvor eine extrem ineffiziente Tabelle!) – rattacat

0

Sie auch unter

select 
    ca.matter_key, 
    ca.activity_key, 
    ca.actrow1, 
    ca.actrow2, 
    ca.actrow3, 
    ca.actrow4 
    FROM CaseAct ca 
join 
(
select matter_key,max(activity_key) as maxkey 
from 
caseact) b 
on b.matter_key=ca.matter_key 
    and b.maxkey=a.activity_key 
0

Nicht sicher verwenden könnte, wenn ich hier etwas fehlt bin aber sicher ist es so einfach wie diese:

select ca.matter_key, 
     max(ca.activity_key) activity_key, 
     ca.actrow1, 
     ca.actrow2, 
     ca.actrow3, 
     ca.actrow4 
from CaseAct ca 
where ca.matter_key in (4945046, 
         5040953, 
         5025296, 
         5078360) 
group by ca.matter_key, 
     ca.actrow1, 
     ca.actrow2, 
     ca.actrow3, 
     ca.actrow4 
0
select 
a.matter_key, 
a.activity_key, 
a.actrow1, 
a.actrow2, 
a.actrow3, 
a.actrow4 
FROM yourtable a 
join 
(
select matter_key, max(isnull(activity_key, 0)) as maxi 
from yourtable) b 
on b.matter_key=a.matter_key 
and b.maxi =isnull(a.activity_key, 0) 
Verwandte Themen