Запрос, который возвращает 10-й и 100-й идентификатор сообщения от пользователя - проводника данных - PullRequest
0 голосов
/ 30 декабря 2018

Я пишу запрос, который будет принимать таблицы Posts и Users из схемы проводника данных и выводить идентификаторы 10-го и 100-го сообщения от каждого пользователя.Выводом будет столбец для идентификатора 10-го или 100-го поста и второй столбец, указывающий, является ли это 10-й или 100-й пост этого пользователя.

У меня проблемы с тем, как я могу получить 10-й и 100-й пост от каждого пользователя.Я начал с подсчета количества сообщений на пользователя, но мой запрос все еще не группирует все идентификаторы пользователей вместе.

SELECT u.Id, u.DisplayName, p.Id, COUNT(p.Id) as numPost
FROM Users AS u
LEFT JOIN Posts AS p ON u.Id = p.OwnerUserId
GROUP BY u.Id, u.DisplayName, p.Id

Я ожидаю, что функция выведет количество постов на пользователя, и посмотрю, смогу ли я извлечь оттуда 10-й и 100-й пост, но думаю, что я иду в неправильном направлении. Текущий вывод запроса

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 30 декабря 2018

Я предлагаю использовать row_number() over(...) для этого:

SELECT
    uid
  , displayname
  , MAX(CASE WHEN rn = 10  THEN pid END) AS pid10
  , MAX(CASE WHEN rn = 100 THEN pid END) AS pid100
FROM (
    SELECT
        u.Id                                                AS uid
      , u.DisplayName
      , p.Id                                                AS pid
      , ROW_NUMBER() OVER (PARTITION BY u.Id ORDER BY p.id) AS rn
    FROM Users AS u
    LEFT JOIN Posts AS p ON u.Id = p.OwnerUserId
    ) AS up
WHERE (
        rn IN (10, 100)
     OR rn IS NULL
      )
GROUP BY
    uid
  , displayname

Я предполагаю, что левое присоединение к сообщениям связано с тем, что вы хотите, чтобы все пользователи вернулись, если это так, обратите внимание на OR RN IS NULL в предложении where.нужен для всех пользователей без постов.

демо

...