构建T-SQL查询:找出交易数据中日均有销售的高频产品
解决思路:统计产品的日均覆盖(销售日期数量)
要解决这个问题,核心是统计每个产品有多少个不同的销售日期——毕竟单日同一产品的多条交易只能算一天的覆盖,我们的目标是找出覆盖日期最多的产品,具体步骤和实现如下:
步骤拆解
- 计算单产品覆盖天数:按产品分组,统计每个产品对应的去重销售日期数量,这就是该产品的日均覆盖天数。
- 定位最大覆盖天数:找出所有产品中最高的覆盖天数,以此为筛选标准。
- 筛选目标产品:提取覆盖天数等于最大值的产品,得到最终结果。
完整T-SQL查询代码
WITH ProductCoverage AS ( -- 第一步:统计每个产品的去重销售日期数量 SELECT 产品, -- 如果日期是字符串格式,建议转换为DATE类型避免格式错误,示例用dd.mm.yy格式转换 COUNT(DISTINCT CONVERT(DATE, 日期, 104)) AS 覆盖天数 FROM 交易数据表名 -- 替换为你的实际表名 GROUP BY 产品 ), MaxCoverage AS ( -- 第二步:获取所有产品中的最大覆盖天数 SELECT MAX(覆盖天数) AS 最大覆盖天数 FROM ProductCoverage ) -- 第三步:筛选出达到最大覆盖天数的产品 SELECT pc.产品, pc.覆盖天数 FROM ProductCoverage pc JOIN MaxCoverage mc ON pc.覆盖天数 = mc.最大覆盖天数 ORDER BY pc.产品;
针对示例数据的验证
用你提供的示例数据运行该查询:
cleaner在02.01.19至08.01.19的7天里每天都有销售,因此覆盖天数=7tablet仅在02.01.19和08.01.19有销售,覆盖天数=2- 其余产品的覆盖天数均小于7天
最终查询结果会返回cleaner;如果有多个产品覆盖天数相同,都会被一并返回。
额外提示
- 如果你的日期字段本身就是
DATE类型,可以去掉CONVERT函数,直接用COUNT(DISTINCT 日期)即可。 - 若需要同时展示产品ID、总销量等附加信息,可在
ProductCoverageCTE中加入对应字段,并在GROUP BY子句中包含它们。
内容的提问来源于stack exchange,提问作者default_settings
相关产品推荐
相关产品推荐

