Sql server 2008 我可以在sql server查询中替换此循环吗

Sql server 2008 我可以在sql server查询中替换此循环吗,sql-server-2008,Sql Server 2008,我有一个项目列表,按日期降序排序,它会像这样检查它们: counted = 0 DateToCheck = now foreach(item) { if( abs(item.date - DateToCheck) > 14 days ) { counted++ } DateToCheck = item.date } index ItemDate 307000 2017-08-17 307001 2017-04-25

我有一个项目列表,按日期降序排序,它会像这样检查它们:

counted = 0
DateToCheck = now  

foreach(item)
{
   if( abs(item.date - DateToCheck) > 14 days )
   {
      counted++
   }
   DateToCheck = item.date
}
 index      ItemDate
  307000    2017-08-17
  307001    2017-04-25 
  307002    2016-09-23
  307003    2016-08-26
  307004    2016-04-30
  307005    2016-03-01
  307006    2016-03-01
目标是获得列表中前一个项目14天内未出现的项目计数

该表只是一个日期列表,如下所示:

counted = 0
DateToCheck = now  

foreach(item)
{
   if( abs(item.date - DateToCheck) > 14 days )
   {
      counted++
   }
   DateToCheck = item.date
}
 index      ItemDate
  307000    2017-08-17
  307001    2017-04-25 
  307002    2016-09-23
  307003    2016-08-26
  307004    2016-04-30
  307005    2016-03-01
  307006    2016-03-01

这里的结果应该是6,最后一个被忽略,因为它是在前一个的14天之内

如果没有ID列,则可以使用此查询。如果有ID列,则直接使用ID列

;WITH TBL AS (
 SELECT ROW_NUMBER() OVER(ORDER BY ItemDate ASC) Id, ItemDate FROM TABLE_NAME 
)
SELECT COUNT(a.ItemDate) FROM TBL a INNER JOIN TBL b ON b.ID = a.ID + 1 WHERE DATEDIFF(d, a.CreatedOn, b.CreatedOn) > 14; 
使用ID列,查询将更改为

SELECT COUNT(a.ItemDate) FROM TABLE_NAME a INNER JOIN TABLE_NAME b ON b.ID = a.ID + 1 WHERE DATEDIFF(d, a.CreatedOn, b.CreatedOn) > 14;

您可以使用此查询

DECLARE @item TABLE([index] int, [date] DATETIME)

INSERT INTO @item 
VALUES( 307006    ,'2017-08-17'),
  (307005    ,'2017-04-25'),
  (307004    ,'2016-09-23'),
  (307003    ,'2016-08-26'),
  (307002    ,'2016-04-30'),
  (307001    ,'2016-03-01'),
  (307000    ,'2016-03-01')

SELECT 
    count(*)
FROM @item T1
    OUTER APPLY ( 
        SELECT TOP 1 * 
        FROM @item T2 
        WHERE T2.[index] < T1.[index]  
        ORDER BY T2.[index] DESC) T
WHERE DATEDIFF(DAY, T.[date], T1.[date])  > 14
DECLARE@item表([index]int,[date]DATETIME)
插入到@item中
价值观(307006,'2017-08-17'),
(307005    ,'2017-04-25'),
(307004    ,'2016-09-23'),
(307003    ,'2016-08-26'),
(307002    ,'2016-04-30'),
(307001    ,'2016-03-01'),
(307000    ,'2016-03-01')
挑选
计数(*)
来自@T1项
外部应用(
选择前1名*
来自@项目T2
其中T2.[index]14

您能将表架构包括在内吗?您有Id列吗对不起,我有Id列,我不知道它在这里是否重要。我有索引列,但我不能指望它们是顺序的使用第一行。它在ItemDate上对行号进行排序