sql-server - 如果组中没有记录比特定数据更新,则分组
问题描述
我在下面的 sql 查询中遇到问题。
SELECT
MAX([DL_Id]) as [DL_Id]
,MAX([DL_CreatedBy]) as [DL_CreatedBy]
,MAX([DL_Created]) as [DL_Created]
,MAX([DL_ModifiedBy]) as [DL_ModifiedBy]
,MAX([DL_Modified]) as [DL_Modified]
,[DL_StandardLetter]
,count(1)
FROM [DB].[dbo].[DL_StandardLetterStatistics]
where (DL_Modified < '2018-01-01' or DL_Created < '2018-01-01')
group by DL_StandardLetter
order by [DL_StandardLetter] asc
现在它正在返回DL_StandardLetterStatistics
日期早于 2018 年的所有记录,并将它们按DL_StandardLetter
.
以下面的数据为例。(大约有200000条记录)
| DL_Created | DL_StandardLetter |
--------------------------------
| 2016-06-06 | 2352 |
| 2019-04-06 | 2352 |
| 2016-06-06 | 2542 |
| 2012-01-01 | 302 |
| 2012-01-01 | 2542 |
| 2017-02-08 | 302 |
我只希望结果返回2542 and 302
,因为所有结果都在 2018 年之前。谁能指出我做错了什么?
解决方案
原因是,您在 WHERE 子句中有 OR 条件。因此,由于其他 OR 条件,数据正在流动。似乎存在一些数据质量问题,其中 DL_Modified 比 DL_Created 更早。
where (DL_Modified < '2018-01-01' or DL_Created < '2018-01-01')
您可以有额外的 HAVING 子句,仅过滤年份 < 2018 的记录。
SELECT
MAX([DL_Id]) as [DL_Id]
,MAX([DL_CreatedBy]) as [DL_CreatedBy]
,MAX([DL_Created]) as [DL_Created]
,MAX([DL_ModifiedBy]) as [DL_ModifiedBy]
,MAX([DL_Modified]) as [DL_Modified]
,[DL_StandardLetter]
,count(1)
FROM [DB].[dbo].[DL_StandardLetterStatistics]
where (DL_Modified < '2018-01-01' or DL_Created < '2018-01-01')
group by DL_StandardLetter
HAVING YEAR(MAX([DL_CreatedBy])) < 2018
ORDER BY [DL_StandardLetter] asc
推荐阅读
- django - Django 帮助中的 ListView
- android - Android Facebook SDK 分享没有链接和图像的文本
- javascript - JS:我试图理解事件发射器与事件监听器
- java - 编译器如何找到丢失的 return 语句?
- java - 删除带有时区字段的时间戳中的时间戳部分
- c# - Blazor 组件接近性能
- ms-word - 未在 Word 中设置 OpenXml 标头设置
- java - Spring Boot 中的时间调度
- javascript - 我创建了一个对象,但是当被调用时,它说未定义(JavaScript)
- android - 为什么计数器变量的值在屏幕上没有变化?