Я пишу запрос, который будет принимать таблицы 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-й пост, но я думаю, что иду в неправильном направлении. Текущий вывод запроса

Любая помощь была бы признательна!

0
mel 30 Дек 2018 в 04:01

1 ответ

Лучший ответ

Я предлагаю использовать 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 будет необходимо для всех пользователей, у которых нет сообщений.

демо

1
Paul Maxwell 30 Дек 2018 в 01:29