Выбор всех строк с наибольшей (относительной) отметкой времени - PullRequest
3 голосов
/ 03 ноября 2010

У меня есть следующая упрощенная структура таблицы в базе данных SQL 2000:

ID  AppName  Key    Value   EffectiveDate
--  -------  -----  ------- -------------
1   App1     One    Past    1/1/1900
2   App1     One    Present 1/1/2010
3   App1     One    Future  1/1/9999
4   App1     Two    Past    1/1/1900
5   App1     Two    Present 1/1/2010
6   App1     Two    Future  1/1/9999
7   App2     One    Present 1/1/2010
8   App2     Two    Present 1/1/2010

Мне нужно иметь возможность задать вопрос:

Учитывая конкретный AppName, покажите мневсе ТОЛЬКО САМЫЕ ПОСЛЕДНИЕ пары ключ / значение, чьи EffectiveDate <= GetDate()

Поэтому, если бы я назвал мой загадочный запрос с AppName = 'App1', мои результаты были бы:

ID  AppName  Key    Value   EffectiveDate
--  -------  -----  ------- -------------
2   App1     One    Present 1/1/2010
5   App1     Two    Present 1/1/2010

EDIT:

Значение может быть любым.(«Прошлое», «Настоящее», «Будущее») были просто использованы, чтобы сделать пример более понятным.Они вполне могли бы быть (45, «Боб», «% $ #% @ # $»).

Ответы [ 4 ]

3 голосов
/ 03 ноября 2010

Я думаю, вам нужно использовать что-то вроде этого:

SELECT T3.*
FROM your_table T4
JOIN
(
    SELECT T2.[Key], T2.EffectiveDate, MAX(T2.ID) AS ID
    FROM your_table T2
    JOIN 
    (
        SELECT [Key], MAX(EffectiveDate) AS EffectiveDate
        FROM your_table
        WHERE AppName = 'App1'
        AND EffectiveDate <= GetDate()
        GROUP BY [Key]
    ) T1
    ON T1.[Key] = T2.[Key] AND T1.EffectiveDate = T2.EffectiveDate
    WHERE T2.AppName = 'App1'
    GROUP BY T2.[Key], T2.EffectiveDate
) T3
ON T3.ID = T4.ID
2 голосов
/ 03 ноября 2010

Что-то еще, чтобы получить последнюю относительную дату.

SELECT *
FROM your_table
WHERE AppName = 'App1'
AND DATE = (SELECT MAX(EffectiveDate ) 
             FROM your_table
             WHERE APPName = 'App1'
              AND EffectiveDate <= GetDate())
0 голосов
/ 03 ноября 2010

Вам необходимо определить, что такое «настоящее».Это последний год?Последнее десятилетие?

Ваш запрос будет выглядеть так

SELECT *
FROM your_table
WHERE EffectiveDate <= GetDate()
--This is where you need to define what "Present" is
AND EffectiveDate > DateAdd(YY, -1, GetDate()) 
AND AppName = 'App1'
0 голосов
/ 03 ноября 2010

Похоже на довольно простой запрос SQL:

select *
from App
where AppName = 'App1'
    and EffectiveDate <= GetDate()

Существует довольно много информации о запросах SQL, но это неплохой старт: http://www.w3schools.com/sql/sql_where.asp

...