SQL-запрос, ВЫБЕРИТЕ ТОП-2 по внешнему ключу Порядок по дате - PullRequest
0 голосов
/ 02 февраля 2010

Мне нужен SQL-запрос, который возвращает 2 верхних плана по PlanDate на ClientID. Это все в одной таблице, где PlanID - это PrimaryID, ClientID - это ForeignID.

Это то, что я имею до сих пор ->

SELECT *
FROM [dbo].[tblPlan] 
WHERE [PlanID] IN (SELECT TOP (2) PlanID FROM [dbo].[tblPlan] ORDER BY [PlanDate] DESC)

Это, очевидно, возвращает только 2 записи, где мне нужно до 2 записей на ClientID.

Ответы [ 2 ]

5 голосов
/ 02 февраля 2010

Это можно сделать с помощью ROW_NUMBER:

SELECT PlanId, ClientId, PlanDate FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY ClientId ORDER BY PlanDate DESC) rn, *
    FROM [dbo].[tblPlan]
) AS T1
WHERE rn <=2

Добавьте все остальные столбцы, которые вам нужны, чтобы получить их тоже.

3 голосов
/ 02 февраля 2010

Редактирование, декабрь 2011 г. Исправленное решение CROSS APPLY

Попробуйте оба варианта, чтобы увидеть, что лучше

SELECT *
FROM
  ( -- distinct ClientID values
   SELECT DISTINCT ClientID 
   FROM [dbo].[tblPlan]
  ) P1
  CROSS APPLY
  ( -- top 2 per ClientID 
   SELECT TOP (2) P2.PlanID
   FROM [dbo].[tblPlan] P2
   WHERE P1.ClientID = P2.ClientID
   ORDER BY P2.[PlanDate] DESC
  ) foo

Или

;WITH cTE AS (
  SELECT
     *,
     ROW_NUMBER () OVER (PARTITION BY clientid ORDER BY [PlanDate] DESC) AS Ranking
  FROM
     [dbo].[tblPlan]
)
SELECT * FROM cTE WHERE Ranking <= 2
...