0

В продолжение моего вопроса How can I take two rows for one Distinct value in postgresql?Как я могу взять две строки для одного значащего значения по времени в postgresql?

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

Но во время работы над ней, я нашел новый вопрос

Когда я ввел временную метку к моему столу

demo_table 
id | column1 | column2 |  timestamp 
1 | 1 | 3 | 2016-09-23 00:20:20 
2 | 2 | 3 | 2016-09-24 00:20:20 
3 | 3 | 4 | 2016-09-24 00:20:20 
4 | 4 | 3 | 2016-09-25 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
6 | 6 | 3 | 2016-09-27 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 

, то запрос

select id, column1, column2 
from (
    select id, column1, column2, 
     row_number() over (partition by column2 order by id) as rn 
    from demo_table 
) t 
where rn <= 2; 

не вернуть то, что я ожидал:

id | column1 | column2 |  timestamp 
3 | 3 | 4 | 2016-09-24 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
6 | 6 | 3 | 2016-09-27 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 

мне нужен запрос, который будет давать этот результат:

id | column1 | column2 |  timestamp 
6 | 6 | 3 | 2016-09-27 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
3 | 3 | 4 | 2016-09-24 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:24:20 

В таблице должны быть различны по COLUMN2 и он также должен держать отображения двух рядов же значения в столбце вместе

Возможно ли это?

+0

Ваш ожидаемый результат такой же, как и фактический вывод, за исключением порядка строк. – redneb

+0

@redneb нет, если вы посмотрите на временные метки, изменив порядок строк, которые должны появиться после других –

+2

Так что просто добавьте 'ORDER BY'. – redneb

ответ

0

Похоже, вам нужны строки «2 последних» для каждого значения в столбце 2. Для этого вы настраиваете элемент order byover clause.

Здесь, чтобы получить «самые последние» строки; закажите отметку по убыванию. Столбец id сохраняется в маловероятном случае, когда вам нужен тай-брейк для заказа.

select id, column1, column2, timestamp 
from (
    select id, column1, column2, timestamp, 
     row_number() over (partition by column2 order by timestamp DESC, id) as rn 
    from demo_table 
) t 
where rn <= 2 
order by column2, timestamp 
; 

(Окончательный порядок метки времени, то изменяется в порядке возрастания)

Примечание: В over clause он является partition by аргумент, который управляет при заказе перезагружается (когда новый «раздел» встречается) и order by затем управляет тем, какая строка в «разделе» становится равной 1.

+0

Решается ли ваш вопрос сейчас? У вас остались вопросы об этом ответе? Чтобы принять ответ «[** Нажмите« Tick »] (https://ibb.co/ikqyO6)», чтобы узнать больше [help/accepting] (https://stackoverflow.com/help/someone-answers) –