Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak połączyć GROUP BY i ROW_NUMBER?

Wow, inne odpowiedzi wyglądają na skomplikowane – więc mam nadzieję, że nie przeoczyłem czegoś oczywistego.

Możesz użyć OVER /PARTITION BY przeciwko agregatom, a następnie wykonają grupowanie/agregację bez GROUP BY klauzula. Dlatego właśnie zmodyfikowałem Twoje zapytanie do:

select T2.ID AS T2ID
    ,T2.Name as T2Name
    ,T2.Orders
    ,T1.ID AS T1ID
    ,T1.Name As T1Name
    ,T1Sum.Price
FROM @t2 T2
INNER JOIN (
    SELECT Rel.t2ID
        ,Rel.t1ID
 --       ,MAX(Rel.t1ID)AS t1ID 
-- the MAX returns an arbitrary ID, what i need is: 
      ,ROW_NUMBER()OVER(Partition By Rel.t2ID Order By Price DESC)As PriceList
        ,SUM(Price)OVER(PARTITION BY Rel.t2ID) AS Price
        FROM @t1 T1 
        INNER JOIN @relation Rel ON Rel.t1ID=T1.ID
--        GROUP BY Rel.t2ID
)AS T1Sum ON  T1Sum.t2ID = T2.ID
INNER JOIN @t1 T1 ON T1Sum.t1ID=T1.ID
where t1Sum.PriceList = 1

Co daje żądany zestaw wyników.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server sp_ExecuteSQL i plany wykonania

  2. Wymuszanie unikalnych pól zakresu dat w SQL Server 2008

  3. Wyzwalacze SQL Server - grupowanie według transakcji

  4. CONCAT_WS() dla SQL Server

  5. tsql ostatnie wystąpienie wewnątrz ciągu