2016-01-14 4 views
0

Скажем, у меня есть таблица с именем TABLEA, имеющие данные оПолучить последние п вхождения каждого значения группы

| col1 | col2 | 
| 1 | 5 | 
| 1 | 6 | 
| 1 | 7 | 
| 2 | 1 | 
| 2 | 2 | 
| 2 | 3 | 
| 2 | 4 | 
| 3 | 3 | 
| 3 | 2 | 
| 3 | 1 | 

Тогда то, что я хотел бы получить в последние 2 вхождений каждого уникального значения col1. Результатом будет

| col1 | col2 | 
| 1 | 6 | 
| 1 | 7 | 
| 2 | 3 | 
| 2 | 4 | 
| 3 | 2 | 
| 3 | 1 | 

Есть ли один запрос, чтобы получить этот результат?

ответ

1

Вы можете использовать ROW_NUMBER

WITH CTE AS(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2 DESC) 
    FROM tbl 
) 
SELECT 
    col1, col2 
FROM CTE 
WHERE rn <= 2 
+0

С этим я получаю первые 2 строки? Поэтому я изменил его на 'rn> 2', и он работал, как мне нравится. Благодаря! – mcspiral

1

Просто расширение на ответ Феликса, предполагая, что есть столбец ID: http://www.sqlfiddle.com/#!3/04a5e/3/0

WITH CTE AS(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY cola ORDER BY id DESC) 
    FROM ta 
) 
SELECT 
    cola, colb 
FROM CTE 
WHERE rn <= 2 
order by id 

нужно реорганизовать по идентификатору, чтобы сохранить правильный порядок, плюс заказ в row_number() идентификатором, потому что col2 не всегда инкрементный.