我想对表执行复杂的自联接。我知道理论上这可以非常有效地完成(见下文),但我无法让 SQL(在 Microsoft SQL Server 上)这样做。
我的问题是:
我怎样才能让 SQL 有效地做到这一点?我需要提供哪些信息才能推断出最佳解决方案或类似的快速解决方案?
输入:
我有一个事件表。每个事件都属于某个项目,并且具有两种类型之一。我可以随意使用这个表,并创建我想要的任何索引,因为它是一个中间表。它也仅用于离线处理,因此以后不会添加新数据。
该表有数亿行。type=0 的条目和 type=1 的条目大致以相同的频率出现,并且它们或多或少是公平的分布,因为输入数据是按照某些规则创建的,因此可以假设以下情况为真对于数据:每次type=0发生事件时,涉及的项目的计数器增加,每次type=1发生事件时,它再次减少。计数器将始终介于 0 和 3(含)之间。
该表目前看起来像这样,但您可以随时提出更改建议:
select
a.item
,case when a.<some_condition> then 1 else 0 end as event_type
,row_number() over(partition by a.item order by a.date asc) as sequence_id -- this makes the order clearer and deals with duplicate dates in a manner that is acceptable for these purposes
,<...> as counter_after_event -- this lies in [1;3] if event_type=0, and in [0;2] if …Run Code Online (Sandbox Code Playgroud) performance sql-server t-sql sql-server-2014 query-performance