Azure SQL DWH - CTE 和随机样本问题

问题描述

我使用版本查询 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;