如何在使用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