SQL 连接到符合特定条件的重复行
Posted
技术标签:
【中文标题】SQL 连接到符合特定条件的重复行【英文标题】:SQL join to duplicate rows which meet certain criteria 【发布时间】:2012-01-20 09:02:11 【问题描述】:我有一个视图可以拉回 46,712 条记录,其中包括以下 2 个字段:
开始日期 & 结束日期
我需要添加一个名为“Period”的新列,在此列中我需要将每条记录列为 'Cumulative' 或 'Non Cumulative'
这样做的问题是,首先我的所有记录都需要有一个 'Cumulative' 行,并且当月活跃的每条记录也必须有一个 'Non-累积'行。
申请记录有资格归类为非累积的规则如下:
结束日期 = NULL
当月结束日期
因为无论条件如何,我的所有行都必须具有“累积”行,因此我必须使用某种 JOIN 复制任何符合“非累积”类型的行。
因此,如果我有 46712 行,其中 200 行是'非累积',我最终应该得到 46,812 行。 (除了累积/非累积结果之外,还有 200 个重复。
有没有人对我应该如何做这件事有任何建议。
【问题讨论】:
【参考方案1】:如果我理解了这个问题,那么这应该可以满足您的需要。
Declare @rowType as table (rowTypeLabel nvarchar(20))
Insert Into @rowType
Values ('Cumulative')
Insert Into @rowType
Values ('Non-Cumulative')
Select StartDate, EndDate, rowTypeLabel As Period
From dbo.YourTable
Cross Join @rowType
Where (@rowType = 'Cumulative'
Or (@rowType = 'Non-Cumulative' And ( EndDate is null
Or
EndDate Between
Cast(DateAdd(Day, 1 - Day(getDate()), getdate()) as date)
And
Cast(DateAdd(month, 1, DateAdd(Day, - Day(getDate()), getdate())) as date))
)
【讨论】:
已将此添加到我的主查询中,但是它将我的运行时间从大约 10 分钟增加到大约 50 分钟,这是因为交叉连接吗?有没有更有效的方法来达到同样的效果? 我会看看查询计划。鉴于交叉连接表中的行数,以上只会将处理的潜在行数增加 2 倍,我更有可能怀疑问题与 are 子句中的 getdate() 有关意味着没有使用索引。如果是这种情况,您可以在查询之前预先计算月初和月底的值并将它们传递进来。由于 where 子句将是确定性的,因此应该使用索引。以上是关于SQL 连接到符合特定条件的重复行的主要内容,如果未能解决你的问题,请参考以下文章