如何在使用SQL的表中找到N个连续记录

我有以下表格定义与样本数据。 在下表中,客户产品和日期是关键字段

Table One
Customer   Product    Date         SALE
   X          A       01/01/2010    YES
   X          A       02/01/2010    YES
   X          A       03/01/2010    NO
   X          A       04/01/2010    NO
   X          A       05/01/2010    YES
   X          A       06/01/2010    NO
   X          A       07/01/2010    NO
   X          A       08/01/2010    NO
   X          A       09/01/2010    YES
   X          A       10/01/2010    YES
   X          A       11/01/2010    NO
   X          A       12/01/2010    YES

在上表中,我需要找到N或N个连续记录,其中没有销售,销售值为'NO'。例如,如果N为2,结果集将返回以下

     Customer   Product    Date         SALE
       X          A       03/01/2010    NO
       X          A       04/01/2010    NO
       X          A       06/01/2010    NO
       X          A       07/01/2010    NO
       X          A       08/01/2010    NO

有人可以帮助我一个SQL查询来获得所需的结果。 我正在使用SQL Server 2005.我开始使用ROW_NUMBER()和PARTITION子句玩,但没有运气。 谢谢你的帮助


你需要将自己的表与自己的表相匹配,就好像有2个表一样。 所以你使用两个别名,o1和o2来引用你的表:

SELECT DISTINCT o1.customer, o1.product, o1.datum, o1.sale
  FROM one o1, one o2
  WHERE (o1.datum = o2.datum-1 OR o1.datum = o2.datum +1)
  AND o1.sale = 'NO' 
  AND o2.sale = 'NO'; 
 customer | product |   datum    | sale 
----------+---------+------------+------
 X        | A       | 2010-01-03 | NO
 X        | A       | 2010-01-04 | NO
 X        | A       | 2010-01-06 | NO
 X        | A       | 2010-01-07 | NO
 X        | A       | 2010-01-08 | NO

请注意,我在postgresql数据库上执行了查询 - 可能在ms-sql-server上的语法不同,也许在别名'FROM one AS o1'中,也许你不能以这种方式添加/减少。


一种不同的方法,受到蒙克最后一线的启发。

获取 - 对于给定日期,第一个日期为YES,晚于YES,最后一个日期为YES。 这些形成了我们的日期适合的边界。

SELECT (o1.datum),
    MAX (o3.datum) - MIN (o2.datum) AS diff
FROM one o1, one o2, one o3 
WHERE o1.sale = 'NO'
AND o3.datum <
    (SELECT MIN (datum) 
    FROM one 
    WHERE datum >= o1.datum 
    AND SALE = 'YES') 
AND o2.datum > 
    (SELECT MAX (datum) 
    FROM one 
    WHERE datum <= o1.datum 
    AND SALE = 'YES') 
GROUP BY o1.datum 
HAVING MAX (o3.datum) - MIN (o2.datum) >= 2
ORDER BY o1.datum;

也许它需要某种优化,因为表1在查询中涉及5次。 :)


感谢大家发布您的解决方案。 以为,我也会与大家分享我的解决方案。 就像参考一样,我从另一个SQL Server Central论坛成员那里得到了这个解决方案。 我绝对不会赞扬这个解决方案。

DECLARE @CNT INT
SELECT @CNT = 3

SELECT * FROM
(
  SELECT
    [Customer], [Product], [Date], [Sale], groupID, 
    COUNT(*) OVER (PARTITION BY [Customer], [Product], [Sale], groupID) AS groupCnt
  FROM
  (
    SELECT
      [Customer], [Product], [Date], [Sale],
      ROW_NUMBER() OVER (PARTITION BY [Customer], [Product] ORDER BY [Date])
      - ROW_NUMBER() OVER (PARTITION BY [Customer], [Product], [Sale] ORDER BY [Date]) AS groupID
    FROM
      [TableSales]
  ) T1
) T2
WHERE
  T2.[Sale] = 'NO' AND T2.[groupCnt] >= @CNT
链接地址: http://www.djcxy.com/p/45557.html

上一篇: How to find N Consecutive records in a table using SQL

下一篇: ins for true 'smart tabs'?