2013-07-25 6 views
1

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

row | value 
----+------- 
    3 | false 
    2 | false 
    1 | true 

У вас есть какие-либо идеи, как применить тот же метод для определения последней строки каждой группы?

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

uid | row | value 
----+-----+------- 
    1 | 3 | false 
    1 | 2 | false 
    1 | 1 | true 
    2 | 4 | false 
    2 | 3 | false 
    2 | 2 | false 
    2 | 1 | true 
    3 | 2 | false 
    3 | 1 | true 

Или вы знаете какой-либо лучший способ обнаружения последних строк в PostgreSQL?

ответ

2

использование PARTITION BY как часть вашего OVER():

select uid,something, 
    ROW_NUMBER() OVER (PARTITION BY uid ORDER BY something desc) as row 
from 
    someTable 

PARTITION BY причин независимо от функции вы используете (например, ROW_NUMBER()) для работы в комплекте отдельно для каждого раздела, который определяется окно - так ROW_NUMBER перезагружается число, MAX найдет максимальное значение для строк в пределах раздела и т. д.

+0

Все, спасибо. – mEan

1

Чтобы определить фактическую последнюю строку на группу (или полностью) без дополнительного подлога y, вы можете использовать функцию окна lead(). Это будет работать для менее тривиальный случай возрастающего порядка, а также:

SELECT uid, something 
     ,row_number() OVER w AS row 
     ,lead (TRUE, 1, FALSE) OVER w AS value 
FROM tbl 
WINDOW w AS (PARTITION BY uid ORDER BY something DESC) 

lead() имеет редко используются функция третьего параметра, обеспечивающего значения по умолчанию, если ни одна строки «ряда» не найдена в группе. Таким образом вы можете вернуть константу TRUE для строки со следующей строкой и заменить FALSE еще.

Я также использую предложение WINDOW, которое является просто условным удобством, поэтому мне не нужно дважды указывать определение окна.

Смежные вопросы