Каждое второе значение из таблицы — sql

#sql #database #postgresql

#sql #База данных #postgresql

Вопрос:

Предположим, у меня есть какая-то таблица, например

 | id | user_id | value | |:---|:-------:| -----:| | 1| 1| a| | 2| 1| b| | 3| 1| c| | 4| 2| d| | 5| 2| e| | 6| 3| f| | 7| 4| g| | 8| 4| h|   

Поэтому мне нужно распечатать все вторые значения для каждого пользователя, например

 | id | user_id | value | |:---|:-------:| -----:| | 2| 1| b| | 5| 2| e| | 8| 4| h|  

Итак, как я могу это сделать?

Комментарии:

1. Что вы пробовали и что получилось? Что представляет собой второе значение (по чему вы заказываете)?

2. Второе основано на заказе, поэтому заказ для a user_id должен быть выполнен id или value . Ваш ожидаемый результат в этом отношении неясен.

3. В моем случае каждое второе значение означает следующее: мы берем каждого пользователя (от user_id). Итак, у пользователя с идентификатором 1 есть значения a, b и c, нам нужно распечатать b. У пользователя с идентификатором 2 есть значения d и e — поэтому мы печатаем e. И, наконец, у пользователя с идентификатором 4 есть значения g и h — и мы печатаем h.

4. @PrintScreenSys Кстати: до комментария у меня не было особых проблем с пониманием вашего вопроса.

5. Все еще не ответил на вопрос. Прямо сейчас id (нет user_id ) и value разделяют один и тот же порядок в том, что числовой порядок id соответствует алфавитному порядку value'. It is not clear to me if that will always be the case. Nor is it clear whether you want second by the order of значений » или по порядку id или обоим?

Ответ №1:

Используйте встроенное представление и аналитику, чтобы сгенерировать номер строки для каждого идентификатора пользователя, упорядоченного по идентификатору, а затем просто выберите, где номер строки = 2.

 SELECT ID, user_ID, Value FROM (SELECT ID, user_ID, Value, Row_number() over (partition by user_ID order by ID) RN  FROM table) InLineTable WHERE RN=2  

или используйте общее табличное выражение, чтобы сделать то же самое

по сути, номер строки делает то, что для каждого идентификатора пользователя он равен 1 для каждого идентификатора. он перезапускается для каждого нового идентификатора пользователя. Поскольку мы заказываем по идентификатору, мы всегда получаем 2-й идентификатор.

 WITH CTE AS (SELECT ID, user_ID, Value, Row_number() over (partition by user_ID   order by ID) RN  FROM table) SELECT ID, user_ID, Value FROM CTE WHERE RN=2  

Ответ №2:

Вы можете использовать ранг в postgres, например, в следующих:

 select id, user_id, value  from (  select id, user_id, value,   rank() over (partition by user_id order by id) as u_rank  from t1  )z  where u_rank = 2  

Выход:

 id user_id value  2 1 b  5 2 e  8 4 h