问题描述
我使用版本查询 Azure sql 数据仓库(又名 Azure Synapse):
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
Microsoft Azure sql Data Warehouse - 10.0.15554.0 Dec 10 2020
我想获取在表中出现两次的 10 个事件的样本,因此它应该返回 20 行。 我正在尝试使用 CTE 来执行此操作,以获得出现两次的 10 个 event_id。然后在 SELECT 子句中,我可以使用 CTE 过滤并获取其余信息:
event_id | date | field3 | field4 |.......
1 | 10/20 | ...... | ...... |.......
2 | 10/21 | ...... | ...... |.......
3 | 10/22 | ...... | ...... |.......
1 | 10/20 | ...... | ...... |.......
我遇到的问题是它返回看起来像是随机数的 行(大约在 10 到 30 之间)。由于查询的编写方式,这不应该发生。 我尝试为 JOIN 更改 WHERE 过滤器,结果相同:
-- CTE
-- get sample of 10 event_id
-- that appear twice
WITH SPL_2_ROWS AS
(SELECT TOP 10 event_id,COUNT(*) AS q_rows
FROM report_table
GROUP BY event_id
HAVING COUNT(*) = 2
ORDER BY NEWID())
-- Main Query
-- get all the information for the
-- prevIoUs 10 event_id
SELECT REP.*
FROM report_table REP
WHERE event_id IN
(SELECT event_id FROM SPL_2_ROWS)
奇怪的是,如果我使用时态表而不是 CTE,查询就可以正常工作。
我在这里遗漏了什么?
附加信息:
该表有大约 60 个字段和 6M 条记录,没有主键:
DDL 创建语句类似于:
JOIN SPL_2_ROWS SPL
ON REP.event_id = SPL.event_id
解决方法
您可以使用窗口函数。但使用聚合和连接可能更简单:
select rt.*
from (select event_id,row_number() over (order by newid()) as seqnum
from report_table rt
group by event_id
having count(*) = 2
) e join
report_table rt
on rt.event_id = e.event_id
where seqnum <= 10;