Как получить базу данных по дате из группы, используя T-SQL - PullRequest
1 голос
/ 21 февраля 2010

Вот данные

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

Вот таблица в SQL SERVER, теперь я хочу получить запись из каждой группы на основе столбца Zone. Поле Флаг этой записи должно быть R, а Дата должна быть ближайшей и после сегодняшней даты.

С наилучшими пожеланиями,

1 Ответ

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

Используя ROW_NUMBER , вы можете попробовать

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

Если вы не можете использовать ROW_NUMBER, вы можете попробовать

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

Но это не исключает дубликатов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...