2010-02-21 2 views
1

Voici les donnéesComment obtenir une base enregistrement à la date d'un groupe à l'aide de T-SQL

Flag  Zone   Info   Date 
R   North  AAA   2010-2-14 
R   North  AAA   2010-2-24 
T   North  AAA   2010-2-4 
R   South  AAA   2010-2-23 
T   South  AAA   2010-2-14 
R   EAST   AAA   2010-2-22 
T   EAST   AAA   2010-2-11 
T   EAST   AAA   2010-2-1 
T   EAST   AAA   2010-2-14 
R   WEST   AAA   2010-2-29 

Voici une table dans le serveur SQL, maintenant je veux obtenir un enregistrement de chaque groupe en fonction Colonne Zone. Le champ Flag de cet enregistrement doit être R, et la date doit être la plus proche et après la date d'aujourd'hui.

Cordialement,

Répondre

3

Utilisation ROW_NUMBER vous pouvez essayer

DECLARE @Table TABLE(
     Flag VARChAR(1), 
     Zone VARCHAR(10), 
     Info VARCHAR(10), 
     Date DATETIME 
) 

INSERT INTO @Table SELECT 'R','North','AAA','2010-2-14' 
INSERT INTO @Table SELECT 'R','North','AAA','2010-2-24' 
INSERT INTO @Table SELECT 'T','North','AAA','2010-2-4' 
INSERT INTO @Table SELECT 'R','South','AAA','2010-2-23' 
INSERT INTO @Table SELECT 'T','South','AAA','2010-2-14' 
INSERT INTO @Table SELECT 'R','EAST',' AAA','2010-2-22' 
INSERT INTO @Table SELECT 'T','EAST',' AAA','2010-2-11' 
INSERT INTO @Table SELECT 'T','EAST',' AAA','2010-2-1' 
INSERT INTO @Table SELECT 'T','EAST',' AAA','2010-2-14' 
INSERT INTO @Table SELECT 'R','WEST',' AAA','2010-2-28' 

;WITH Dates AS(
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Zone ORDER BY Date) ROWID 
    FROM @Table 
    WHERE Flag = 'R' 
    AND  Date > GETDATE() 
) 
SELECT * 
FROM Dates 
WHERE ROWID = 1 

Si vous ne pouvez pas utiliser ROW_NUMBER vous pouvez essayer

SELECT t.* 
FROM (
      SELECT Zone, 
        MAX(Date) MaxDate 
      FROM @Table 
      WHERE Flag = 'R' 
      AND  Date > GETDATE() 
      GROUP BY Zone 
     ) Dates INNER JOIN 
     @Table t ON Dates.Zone = t.Zone and Dates.MaxDate = t.Date 

Mais ce n'exclurons les doublons ...

+0

Merci, je vais essayer plus tard. –

Questions connexes