SQL查询过滤问题:日期按年筛选、取最新记录及dbo.Items条件过滤
问题1:日期字段与dbo.Items.Condition='A'过滤失效解决
- 你当前代码中
dbo.Items是左连接关联,若直接在WHERE子句添加dbo.Items.Condition = 'A'会将左连接隐式转为内连接,导致无Items匹配的记录被过滤:- 若需要保留无Items匹配的记录:将
dbo.Items.Condition = 'A'添加到LEFT OUTER JOIN dbo.Items的ON子句中 - 若仅需要保留Condition为A的匹配记录:在
WHERE子句中添加AND dbo.Items.Condition = 'A'即可
- 若需要保留无Items匹配的记录:将
- 日期过滤优化:现有
YEAR(ed.Created) >=2021逻辑有效,但如果数据量较大,建议改为ed.Created >= '2021-01-01',避免对每行做函数运算,可利用ed.Created字段的索引提升查询效率。
问题2:ed.Created字段转年份实现按年筛选
- 你代码中已使用
YEAR(ed.Created) AS Jaar正确提取了年份值,若需要按指定年份筛选,直接在WHERE子句添加YEAR(ed.Created) = 目标年份即可; - 高性能筛选方案:如需筛选某一年数据可使用日期范围写法,例如筛选2023年数据:
ed.Created >= '2023-01-01' AND ed.Created < '2024-01-01',兼容性和执行效率更高。
问题3:去除重复记录仅保留最新数据
- 使用
ROW_NUMBER()窗口函数,按你需要去重的业务维度分组(示例按ItemCode、PropName分组,可按需调整),按ed.Created倒序排序,取排序为1的记录即为最新数据。
修正后完整代码
WITH ranked_log AS ( SELECT h.fullname AS FullName, ep.PropName, i.ItemCode, dbo.Items.Description, ep.CaptionTermId, ed.OldValue, ed.NewValue, YEAR(ed.Created) AS Jaar, i.crdnr, dbo.cicmpy.cmp_name, ed.Created, -- 按业务去重字段分组,按创建时间倒序排序 ROW_NUMBER() OVER (PARTITION BY i.ItemCode, ep.PropName ORDER BY ed.Created DESC) AS rn FROM dbo.cicmpy RIGHT OUTER JOIN dbo.ItemAccounts AS i ON dbo.cicmpy.crdnr = i.crdnr LEFT OUTER JOIN dbo.Items ON i.ItemCode = dbo.Items.ItemCode AND dbo.Items.Condition = 'A' -- 左连接场景下Condition过滤放此处 RIGHT OUTER JOIN dbo.EbcDataLog AS ed INNER JOIN dbo.EbcProps AS ep ON ed.Property = ep.PropId LEFT OUTER JOIN dbo.humres AS h ON ed.Creator = h.res_id ON CAST(i.ID AS varchar(36)) = ed.DataKey WHERE i.ItemCode LIKE 'I4107.RHB0029' AND ep.CaptionTermId = 4850 AND ed.Created >= '2021-01-01' -- 优化后的日期过滤 ) SELECT * FROM ranked_log WHERE rn = 1 -- 仅取最新的一条记录 ORDER BY PropName
内容的提问来源于stack exchange,提问作者Barendrecht
相关产品推荐
相关产品推荐

