Как выбрать первые 3 значения из группы на основе даты и исключить повторяющиеся значения? - PullRequest
0 голосов
/ 28 мая 2019

Если у меня три столбца и 1 столбец имеет идентификатор, 1 столбец имеет значение, а 1 столбец имеет дату. Например, столбец ID имеет ID1, ID2, ID3. Значение для каждого идентификатора имеет числовое значение, скажем 1,2,3,4,5 для каждого идентификатора.
Как получить только 3 результата для каждого идентификатора на основе самой последней даты по убыванию. Я использую Sybase SQL. Есть ли способ, которым я могу написать это?

Я пытался использовать Row_number () и rank (), но я не могу использовать ни одну из этих функций с моим инструментом SQL.

ID  value   Date
1   3   20190511
1   1   20190503
1   5   20190401
2   2   20190520
2   1   20190514
2   4   20190503
3   1   20190516
3   5   20190415
3   3   20190402

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Один метод использует коррелированный подзапрос с in:

select t.*
from t
where t.date in (select top (3) t2.date
                 from t t2
                 where t2.id = t.id
                 order by t2.date desc
                );

Обратите внимание, что это предполагает, что даты являются уникальными.

0 голосов
/ 28 мая 2019

Если у вас нет row_number, попробуйте

SELECT * 
FROM yourTable t1
WHERE (SELECT COUNT(*) 
       FROM yourTable t2
       WHERE t1.id = t2.id
         AND t1.date < t2.date) < 3

Так что если один идентификатор имеет 3 или более старых строк, он не появится.

с номером строки

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) as rn
      FROM YourTable t1
     ) as t
WHERE t.rn <= 3

Полагаю, вы не можете иметь несколько строк в одну и ту же дату. В этом случае вы можете использовать RANK() или DENSE_RANK() и решить, как обрабатывать связи.

...