识别季节性销售项目的SQL查询

识别季节性销售项目的SQL查询,sql,tsql,Sql,Tsql,我需要一个SQL查询,将确定季节性销售项目 我的表格结构如下: ProdId WeekEnd Sales 234 23/04/09 543.23 234 30/04/09 12.43 432 23/04/09 0.00 etc 我需要一个SQL查询,该查询将返回连续26周销售为0的所有ProdId。我正在运行SQLServer2005。非常感谢 更新:一位同事提出了一个使用rank的解决方案-我现在正在研究…以下是我的版

我需要一个SQL查询,将确定季节性销售项目

我的表格结构如下:

ProdId    WeekEnd     Sales
234       23/04/09    543.23
234       30/04/09     12.43
432       23/04/09      0.00
etc
我需要一个SQL查询,该查询将返回连续26周销售为0的所有ProdId。我正在运行SQLServer2005。非常感谢

更新:一位同事提出了一个使用rank的解决方案-我现在正在研究…

以下是我的版本:

SELECT DISTINCT
  s1.ProdId
FROM (
    SELECT
      ProdId,
      ROW_NUMBER() OVER (PARTITION BY ProdId ORDER BY WeekEnd) AS rownum,
      WeekEnd
    FROM Sales
    WHERE Sales <> 0
) s1
INNER JOIN (
    SELECT
      ProdId,
      ROW_NUMBER() OVER (PARTITION BY ProdId ORDER BY WeekEnd) AS rownum,
      WeekEnd
    FROM Sales
    WHERE Sales <> 0
) s2
ON s1.ProdId = s2.ProdId
AND s1.rownum + 1 = s2.rownum
AND DateAdd(WEEK, 26, s1.WeekEnd) = s2.WeekEnd;
DECLARE @NumWeeks int
SET @NumWeeks = 26

SELECT s1.ProdID, s1.WeekEnd, COUNT(*) AS ZeroCount
FROM Sales s1
INNER JOIN Sales s2
    ON s2.ProdID = s1.ProdID
    AND s2.WeekEnd >= s1.WeekEnd
    AND s2.WeekEnd <= DATEADD(WEEK, @NumWeeks + 1, s1.WeekEnd)
WHERE s1.Sales > 0
GROUP BY s1.ProdID, s1.WeekEnd
HAVING COUNT(*) >= @NumWeeks

这将大大降低查询速度,但保证始终考虑记录销售的第一周。

所有商品的销售时间均为26周,销售为0:公司开始销售任何商品之前的26周。您需要将日期范围限制为某个开始日期和停止日期,以使此查询更有意义。既然如此,我的问题是:开始和结束日期总是相隔26周,还是可以更久?它们是作为查询的一部分指定的吗?是的,26周期间的任何一方都需要销售数据,我应该说明这一点。现在我再仔细考虑一下,我们可能希望它在26到30周之间没有销售。但是如果我能得到一个运行26周的查询,我很乐意使用27、28、29、30周的更改参数来执行它……这只会比较之后26周的销售情况;OP希望所有连续26周都为0。这并没有改变任何事情。它仍在将第一个子查询中的一条记录与第二个子查询中的一条记录进行比较。它将发现任何产品的任何两个条目正好相隔26周,其中任何一个都没有零销售额;这甚至与问题所问的不太接近。实际上,这个版本可能不会返回任何结果,因为这个问题意味着连续的条目总是相隔1周,这预计它们相隔26周。行_编号应用在WHERE子句之后,因此如果第一次销售是在1月份,直到7月份的所有周内都没有销售,7月份记录的行数将是1+1月份记录的行数。
OR s1.WeekEnd = (SELECT MIN(WeekEnd) FROM Sales WHERE ProdID = s1.ProdID)