Способ найти максимальные даты без футуристических дат - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь перечислить последнее количество (MAX EffectiveDate time, избегая Futuristic EffectiveDate) для каждого кода в таблице

Code     Quantity EffectiveDate
1        2        1-Mar-2018
1        3        1-Apr-2018
1        3        1-May-2018
1        3        1-June-2018
2        5        1-Mar-2018
2        6        1-Apr-2018
3        7        1-Feb-2018
3        8        1-Mar-2018
3        5        1-Apr-2018

Желаемый результат должен быть:

Code     Quantity EffectiveDate
1        3        1-May-2018
2        6        1-Apr-2018
3        5        1-Apr-2018

Я попробовал решение из GROUP BY с МАКС. (ДАТА) Но это показывает футуристические данные.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Чтобы получить полные строки, вы можете использовать:

SELECT TOP 1 WITH TIES *
FROM table
WHERE EffectiveDate <= GETDATE()
ORDER BY ROW_NUMBER() OVER(PARTITION BY code ORDER BY EffectiveDate DESC);

Демоверсия DBFiddle


EDIT:

Если среди одной группы кодов возможны связи, вы можете использовать RANK:

SELECT TOP 1 WITH TIES *
FROM tab
WHERE EffectiveDate <= GETDATE()
ORDER BY RANK() OVER(PARTITION BY code ORDER BY EffectiveDate DESC);

DBFiddle Demo 2

0 голосов
/ 16 мая 2018

Это зависит от вашей цели.Если вы хотите игнорировать, если MAX дата в будущем, вам нужно использовать HAVING:

SELECT Code,
       Quantity,
       MAX(EffectiveDate)
FROM YourTable
GROUP BY Code, Quantity
HAVING MAX(EffectiveDate) <= GETDATE();

Если, однако, вы хотите, чтобы MAX дата была меньше текущейдату, используйте WHERE:

SELECT Code,
       Quantity,
       MAX(EffectiveDate)
FROM YourTable
WHERE EffectiveDate <= GETDATE()
GROUP BY Code, Quantity;

Ваш вопрос неясен, какой ответ является правильным;и мы не можем сделать вывод из каких-либо данных выборки.

Редактировать:

Если мы используем следующие образцы данных:

CREATE TABLE YourTable (Code int, Quantity int, EffectiveDate date);
GO

INSERT INTO YourTable
VALUES(1,1,'20180501'),
      (1,1,'20180516'),
      (1,1,'20180521'),
      (2,1,'20180501'),
      (2,1,'20180521'),
      (3,1,'20180501');
GO

Для первого запроса результат будетбыть:

Code        Quantity    EffectiveDate
----------- ----------- -------------
3           1           2018-05-01

Для второго это будет:

Code        Quantity    EffectiveDate
----------- ----------- -------------
1           1           2018-05-16
2           1           2018-05-01
3           1           2018-05-01
0 голосов
/ 16 мая 2018

Используйте предложение WHERE с функцией GETDATE()

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