Как разбить результаты Stack Exchange Data Explorer (SEDE) на страницы?

Использование обозревателя данных для создания запросов:

SELECT P.id, creationdate,tags,owneruserid,answercount
--SELECT DISTINCT TAGNAME ,TAGID
FROM TAGS  AS T
JOIN POSTTAGS AS PT
ON T.ID = PT.TAGID
JOIN POSTS AS P
ON PT.POSTID = P.ID
--WHERE CAST(P.TAGS AS VARCHAR) IN('JAVA')
WHERE PT.TAGID = 3143

Как можно добавить в запрос разбиение на страницы, чтобы получить не только первые 50 000 результатов, но и затем снова запустить запрос, чтобы получить следующие оставшиеся результаты?


person Stiar    schedule 16.08.2018    source источник


Ответы (1)


Есть несколько способов «пролистать» результаты TSQL; видеть:

Здесь я буду использовать метод CTE как:

  • Он использует удобные номера строк для постраничного просмотра результатов, а не пытается отслеживать менее предсказуемые факторы, такие как creationdate.
  • Сообщается, что он работает быстрее, чем метод OFFSET.

Таким образом, запрос этого вопроса становится этот запрос SEDE:

-- StartRow: Starting row for paging
-- EndRow: Ending row for paging (Max 50K rows at a time)
WITH allData AS (
    SELECT
                ROW_NUMBER() OVER (ORDER BY P.creationdate) AS row
                , P.id
                , P.creationdate
                , P.tags
                , P.owneruserid
                , P.answercount
    FROM        Posttags    AS PT
    JOIN        Posts       AS P    ON PT.postid = P.id
    WHERE       PT.tagid    = 3143  -- tag [scala]
)
SELECT      *
FROM        allData
WHERE       row    >= ##StartRow:INT?1##
AND         row    <= ##EndRow:INT?50000##
ORDER BY    row
person Brock Adams    schedule 16.08.2018
comment
Супер полезно! Я изменил это, чтобы сделать его немного быстрее и проще в использовании: 1) удалив условие row <= ##EndRow:INT?50000## и 2) изменив первое условие на row >= 1 + 50000*(##StartRow:INT?1## - 1), чтобы мои входные данные могли быть 1, 2, 3, ... вместо 1, 50001, 100001, ... - person Ben; 23.01.2020