gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:52:13 25 4
gpt4 key购买 nike

我查询 Azure SQL 数据仓库(又名 Azure Synapse),版本为:

Microsoft Azure SQL Data Warehouse - 10.0.15554.0 Dec 10 2020

所以我有一个包含事件和附加数据的表,如下所示:

    event_id  |  date    | field3    | field4 |.......  
1 | 10/20 | ...... | ...... |.......
2 | 10/21 | ...... | ...... |.......
3 | 10/22 | ...... | ...... |.......
1 | 10/20 | ...... | ...... |.......

我想要获取在表中出现两次的 10 个事件的样本,因此它应该返回 20 行。我正在尝试使用 CTE 来完成此操作,以获得出现两次的 10 个 event_id 。然后在 SELECT 子句中我可以使用 CTE 来过滤并获取其余信息:

 -- 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)

我遇到的问题是它返回看起来像随机数的行(10 到 30 之间)。由于查询的编写方式,这种情况不应该发生。我尝试更改 JOIN 的 WHERE 过滤器,得到相同的结果:

JOIN SPL_2_ROWS  SPL
ON REP.event_id = SPL.event_id

奇怪的是,如果我使用时态表而不是 CTE,查询就可以正常工作。
我在这里缺少什么?

其他信息:
该表有大约 60 个字段和 6M 条记录,没有主键:DDL 创建语句类似于:

CREATE TABLE [my_schema].[report_table]
(
[my_date] [datetime2](7) NULL,
[field2] [nvarchar](4000) NULL,
...
...
...
[event_id] [int] NULL,
[client_id] [int] NULL,
[field30] [nvarchar](4000) NULL,
[field31] [nvarchar](4000) NULL,
[field32] [int] NULL,
...
...
...
)
WITH
(
DISTRIBUTION = ROUND_ROBIN,
HEAP
)
GO

最佳答案

您可以使用窗口函数。但通过聚合和连接可能会更简单:

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;

关于sql - Azure SQL DWH - CTE 和随机样本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66263040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com