如何对 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 &lt;= ##EndRow:INT?50000## 和 2) 将第一个条件更改为 row &gt;= 1 + 50000*(##StartRow:INT?1## - 1) 以便我的输入可以是 1、2、3……而不是1, 50001, 100001, ...

以上是关于如何对 Stack Exchange Data Explorer (SEDE) 结果进行分页?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 curl 登录 Stack Exchange?

Stack Exchange 数据资源管理器上的 SQL - 定义值

json Stack Exchange热门标签

ini Stack Exchange HAProxy

ini Stack Exchange HAProxy

[Data Structure] Stack Implementation in Python