2016-09-16 6 views
1

Hey all dies ist die Abfrage, die ich bisher habe:Gesamtanzahl einer Fensterfunktion mit

WITH LIMIT AS 
     (SELECT 
      U.userID 
      ,U.username 
      ,U.fname  
      ,U.mname  
      ,U.lname  
      ,U.email  
      ,U.active 
      ,S.sName 
      ,S.sID 
      ,T.[value] 
      ,T.trackingNumberID 
      ,SU.primaryLocation 
      ,row_number() OVER (ORDER BY U.userid) AS RN 
      ,COUNT(*) OVER (ORDER BY U.userid) AS CNT 
      ,UR.roleID 
     FROM 
      [---].[dbo].[tblUsers]       AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T 
      ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU]     AS SU 
      ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS]     AS S 
      ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles]   AS UR 
      ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles]    AS R 
      ON UR.roleID = R.roleID 
     WHERE 
      U.active = 1 
     AND 
      SU.primaryLocation = 1 
     AND 
      SU.active = 1 
     AND 
       U.orgID = 1 
      AND 
       S.ID = 35 
      AND U.userID IN (SELECT userID 
           FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S 
           ON S.sID = SU.sID 
           WHERE 
           SU.active = 1 
           AND 
           S.sID = 35) 
) SELECT * FROM LIMIT WHERE RN Between 0 AND 10000 

Wie Sie durch die Abfrage siehe oben Ich versuche COUNT (*) OVER (ORDER BY U. userid) AS CNT was mir die gleiche Anzahl wie RN gibt.

Was ich brauche, ist die Gesamtmenge der Datensätze diese (842 Zeilen) bringen würde wieder.

+0

einfach zählen (*) und nicht partitionieren. Soll das nicht sein, was du brauchst? – scsimon

+0

Ha das war es @a_horse_with_no_name. Bitte machen Sie die offizielle Antwort, damit ich Ihnen Kredit geben kann. – StealthRT

+0

verwenden Sie RN nur zur Begrenzung auf weniger als 1000 Zeilen? Verwenden Sie stattdessen Top oder Fetch zuerst ... viel schneller. – Hogan

Antwort

2

COUNT(*) OVER (ORDER BY U.userid) AS CNT berechnet eine "laufende Zählung" - die Zählung bis "diese" Reihe. Wenn Sie alle Zeilen im kompletten Ergebnis zählen möchten, verwenden Sie die Fensterfunktion ohne order by

COUNT(*) OVER() AS CNT 
1

dieser Kuckuck klingen mag, aber ich fand mit großen Tabellen Sie eine bessere Leistung, wenn man die Zählung in eine Variable auswählen und Wählen Sie dann Ihre Datensätze und fügen Sie einfach die Variable hinzu. etwas mit dem count (*) over() verursacht eine schlechte Leistung, wenn Tabellen zu groß werden.

DECLARE @RecordCount INT 
SELECT @RecordCount = COUNT(*) 
FROM [---].[dbo].[tblUsers] AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU] AS SU ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS] AS S ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles] AS UR ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles] AS R ON UR.roleID = R.roleID 
WHERE U.active = 1 
     AND SU.primaryLocation = 1 
     AND SU.active = 1 
     AND U.orgID = 1 
     AND S.ID = 35 
     AND U.userID IN (SELECT userID 
         FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S ON S.sID = SU.sID 
         WHERE SU.active = 1 
           AND S.sID = 35) 

SELECT U.userID, 
     U.username, 
     U.fname, 
     U.mname, 
     U.lname, 
     U.email, 
     U.active, 
     S.sName, 
     S.sID, 
     T.[value], 
     T.trackingNumberID, 
     SU.primaryLocation, 
     @RecordCount AS CNT, 
     UR.roleID 
FROM [---].[dbo].[tblUsers] AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU] AS SU ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS] AS S ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles] AS UR ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles] AS R ON UR.roleID = R.roleID 
WHERE U.active = 1 
     AND SU.primaryLocation = 1 
     AND SU.active = 1 
     AND U.orgID = 1 
     AND S.ID = 35 
     AND U.userID IN (SELECT userID 
         FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S ON S.sID = SU.sID 
         WHERE SU.active = 1 
           AND S.sID = 35) 
ORDER BY U.userID 
OFFSET 0 ROWS FETCH NEXT 10000 ROWS ONLY 
+0

Guter Punkt auch, Jamie. – StealthRT