如何对 Stack Exchange Data Explorer (SEDE) 结果进行分页?
Posted
技术标签:
【中文标题】如何对 Stack Exchange Data Explorer (SEDE) 结果进行分页?【英文标题】:How to paginate Stack Exchange Data Explorer (SEDE) results? 【发布时间】:2019-01-23 20:22:25 【问题描述】:使用data explorer 创建查询:
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 个结果,然后再次运行查询以获取下一个剩余结果?
【问题讨论】:
【参考方案1】:有几种方法可以通过 TSQL 结果“分页”;见:
How to return a page of results from SQL? 和 SQL performance: WHERE vs WHERE(ROW_NUMBER)这里我将使用 CTE 方法作为:
它使用方便的行号来翻阅结果,而不是尝试跟踪难以预测的因素,例如creationdate
。
据报道,它的执行速度比 OFFSET
方法快。
所以,这个问题的查询变成了this SEDE query:
-- 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
【讨论】:
超级好用!我对此进行了调整,使其更快更易于使用,方法是 1) 删除条件row <= ##EndRow:INT?50000##
和 2) 将第一个条件更改为 row >= 1 + 50000*(##StartRow:INT?1## - 1)
以便我的输入可以是 1、2、3……而不是1, 50001, 100001, ...以上是关于如何对 Stack Exchange Data Explorer (SEDE) 结果进行分页?的主要内容,如果未能解决你的问题,请参考以下文章