Maximalwerte pro Gruppe erhalten

Rohdaten als Ergebnis einer create view "data" as select [...] statement:

 projectId resourceId num 1052785922 318153743 10 1052785922 318153743 20 1052785922 318153743 30 1052785936 -2097765361 20 1052785936 318153743 10 1052785936 528513104 30 1052786014 -2097765361 20 1052786014 318153743 10 1052786014 528513104 30 1052786021 -2097765361 20 1052786021 318153743 10 1052786021 528513104 30 1052786099 -2097765361 20 1052786099 318153743 10 

Ich versuche, über data zu filtern, um diese Zeilen nur mit max (num) pro projectId zu erhalten.

geschätzte Ergebnisse:

 projectId resourceId num 1052785922 318153743 30 1052785936 528513104 30 1052786014 528513104 30 1052786021 528513104 30 1052786099 -2097765361 20 

Ich weiß über die Möglichkeiten, sich selbst links auf num = max(num) , windows-function wie max(num) over ( partition by projectId ) oder CTE, aber ich frage mich, ob es eine andere Möglichkeit, nur diejenigen mit dem höchsten Wert von num

background: Über data ist nur ein Punkt von einer großen view, die relativ komplex ist. Da es eine view ist, denke ich nicht an CTEs oder irgendetwas auf diese Weise. Die in der view bereitgestellten data sollen eine Planungsapplikation füttern und die Laufzeit ist sehr wichtig. Ich will nicht kämpfen, endet in der performance – teure view-auswählt.

Die obigen "Rohdaten" ist das Ergebnis einer view, die data aus Dutzenden von Tabellen kombiniert. Ich suche nach einem path, um für die gruppierten Max-Werte in der Erstellungs-statement dieser view direkt auf einen Schuss zu filtern, ohne eine zusätzliche Schicht oder einen Blick dazwischen setzen zu müssen!

So was:

 WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY projectId ORDER BY num DESC) rownum FROM Table1 ) SELECT projectId, resourceId, num FROM CTE WHERE rownum = 1; 

SQL Fiddle Demo

das wird dir geben

 | PROJECTID | RESOURCEID | NUM | ---------------------------------- | 1052785922 | 318153743 | 30 | | 1052785936 | 528513104 | 30 | | 1052786014 | 528513104 | 30 | | 1052786021 | 528513104 | 30 | | 1052786099 | -2097765361 | 20 | 

dieses mega-script benutzt keine sortierung;) versuch

 SELECT * FROM dbo.test3 t WHERE EXISTS ( SELECT 1 FROM dbo.test3 WHERE projectId = t.projectId GROUP BY projectId HAVING MAX(num) = t.num ) 

Demo auf SQLFiddle

Ich habe es geschafft, die view als aus einer UDF zu wählen, um die data so zu verarbeiten, wie es Mahmoud tun soll. UDF erlaubt mir, Temp-Tabellen anstelle von CTE verwenden, die mehrmals eventuell ausgeführt werden können.

Vielen Dank an alle Hinweise!