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

use*_*587 8 sql sql-server-2005

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

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
Run Code Online (Sandbox Code Playgroud)

在上表中,我需要找到没有销售的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
Run Code Online (Sandbox Code Playgroud)

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

use*_*own 5

您需要将您的桌子与自己匹配,就好像那里有 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
Run Code Online (Sandbox Code Playgroud)

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