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 连接到符合特定条件的重复行的主要内容,如果未能解决你的问题,请参考以下文章

SQL多表联查总结

MySqli无法连接到本地主机[重复]

根据特定条件查找重复值

从文件中删除重复的反向行的问题

基于另一个[重复]构建一列

如何使用 php 从 SQL 数据库中选择包含特定文本的所有行 [重复]