Sql server 循环查询并查看以前的记录-SQL Server

Sql server 循环查询并查看以前的记录-SQL Server,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个SQL: ;WITH cte AS ( SELECT lngTIMEID as Id, lngEMPID as EmployeeId, dtmdateapp AS [Date], stroccur AS [Value], (SELECT SUM(stroccur) FROM [Attendance].[dbo].[timeuse] WHERE dtmdat

我有一个SQL:

;WITH cte AS 
(
    SELECT 
        lngTIMEID as Id,
        lngEMPID as EmployeeId,
        dtmdateapp AS [Date], 
        stroccur AS [Value],
        (SELECT SUM(stroccur) 
         FROM [Attendance].[dbo].[timeuse] 
         WHERE dtmdateapp <= d.dtmdateapp 
           AND dtmdateapp >= Dateadd(yy, -1, d.dtmdateapp) 
           AND lngempid = d.lngempid 
           AND absence <> 'Scheduled') AS Total
    FROM   
        [Attendance].[dbo].[timeuse] d
    WHERE 
        lngEMPID =  1162002 AND Absence <> 'Scheduled' 
) 
SELECT 
    cte.*, 
    CASE
       WHEN Total >= 1 AND Total < 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Written'
       WHEN Total > 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Final'
       WHEN Total >= 3 AND Total < 4 THEN 'Verbal'
       WHEN Total >= 4 AND Total < 5 THEN 'Written'
       WHEN Total >= 5 AND Total < 6 THEN 'Final'
       WHEN Total >= 6 THEN 'Termination'
    END AS [Status]
FROM
    cte
JOIN 
    [CSAR].[dbo].[rpt_tblAssociate] c ON c.EmployeeID = cte.EmployeeId
JOIN 
    [CSAR].[dbo].[rpt_tblEmployHx] h ON h.ReportingId = c.ReportingId
WHERE 
    Date > DATEADD(yy, -1, GETDATE())
我想确定在此数据集中发布最终状态的次数。在我展示的这个数据中,我想将其转换为结果2

如果数据集显示连续的最终结果,则它们应仅计为1。例如,296746、298464有两个连续的最终状态…这只会在最终状态计数中增加1

以下是我试图实现的目标:

var finalcount = 0;
var previous = "";

foreach ( var record in recordset)
{
    if(record.Status == "Final" && prevous.Status != "Final")
    {
        finalcount++;
    }

    previous = record;
}

无需重新编码现有代码,您可以将其包装在另一个通用表表达式中,并使用lag:

rextester演示:

包装在另一个cte现有代码中以添加上述内容的示例:

;WITH cte 
     AS (SELECT lngTIMEID as Id,
                lngEMPID as EmployeeId,
                dtmdateapp AS [Date], 
                stroccur AS [Value],
                (SELECT Sum(stroccur) 
                 FROM   [Attendance].[dbo].[timeuse] 
                 WHERE  dtmdateapp <= d.dtmdateapp 
                        AND dtmdateapp >= Dateadd(yy, -1, d.dtmdateapp) 
                        AND lngempid = d.lngempid 
                        AND absence <> 'Scheduled') AS Total
         FROM   [Attendance].[dbo].[timeuse] d
                 WHERE lngEMPID =  1162002 AND Absence <> 'Scheduled' ) 

, t as (
SELECT cte.*, CASE
WHEN Total >= 1 AND Total < 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Written'
WHEN Total > 2 AND cte.[Date] <= DATEADD(DD, 90, h.HireDate) THEN 'Final'
WHEN Total >= 3 AND Total < 4 THEN 'Verbal'
WHEN Total >= 4 AND Total < 5 THEN 'Written'
WHEN Total >= 5 AND Total < 6 THEN 'Final'
WHEN Total >= 6 THEN 'Termination'
 END AS [Status]
FROM cte
JOIN [CSAR].[dbo].[rpt_tblAssociate] c ON c.EmployeeID = cte.EmployeeId
JOIN [CSAR].[dbo].[rpt_tblEmployHx] h ON h.ReportingId = c.ReportingId
WHERE Date > DATEADD(yy, -1, GETDATE())
)
select CountFinal = count(*)
from (
  select *, prev_status = lag(status) over (order by id)
  from t
  ) sub
where sub.Status = 'Final' 
  and isnull(sub.prev_status,'') <> 'Final'
通过重新编码,我相信您可以将其简化为以下内容:

+--------+------------+------------+-------+-------+-------------+
|   Id   | EmployeeId |    Date    | Value | Total |   Status    |
+--------+------------+------------+-------+-------+-------------+
| 286320 |    1162002 | 9/13/2016  |  0.00 |  1.75 | NULL        |
| 288479 |    1162002 | 9/29/2016  |  0.25 |  2.25 | NULL        |
| 288523 |    1162002 | 9/28/2016  |  0.25 |  2.00 | NULL        |
| 290832 |    1162002 | 10/17/2016 |  1.00 |  3.25 | Verbal      |
| 290833 |    1162002 | 10/17/2016 |  0.00 |  3.25 | Verbal      |
| 295309 |    1162002 | 11/17/2016 |  0.25 |  3.50 | Verbal      |
| 296655 |    1162002 | 12/1/2016  |  1.00 |  4.50 | Written     |
| 296746 |    1162002 | 12/2/2016  |  1.00 |  5.50 | Final       |
| 298464 |    1162002 | 12/6/2016  |  0.25 |  5.75 | Final       |
| 299658 |    1162002 | 12/14/2016 |  0.25 |  6.00 | Termination |
| 300320 |    1162002 | 12/19/2016 |  0.25 |  6.25 | Termination |
| 302682 |    1162002 | 1/6/2017   |  0.25 |  6.50 | Termination |
| 317070 |    1162002 | 2/15/2017  |  0.25 |  5.75 | Final       |
| 324818 |    1162002 | 3/15/2017  |  0.25 |  6.00 | Termination |
| 330543 |    1162002 | 4/17/2017  |  0.25 |  6.25 | Termination |
| 333859 |    1162002 | 5/8/2017   |  0.00 |  6.25 | Termination |
| 334141 |    1162002 | 5/9/2017   |  1.00 |  7.25 | Termination |
| 336519 |    1162002 | 5/21/2017  |  0.25 |  7.50 | Termination |
+--------+------------+------------+-------+-------+-------------+
;with cte as (
  select 
     lngtimeid as Id
   , lngempid as EmployeeId
   , dtmdateapp as [Date]
   , stroccur as [Value]
   , x.Total
   , prev_total = lag(x.Total) over (order by lngtimeid)
  from [Attendance].[dbo].[timeuse] d
    cross apply (
      select total = sum(stroccur)
    from [Attendance].[dbo].[timeuse] i
    where i.dtmdateapp <= d.dtmdateapp 
      and i.dtmdateapp >= Dateadd(year,-1, d.dtmdateapp) 
      and i.lngempid = d.lngempid 
      and i.absence <> 'Scheduled'
    ) x
  where d.lngempid = 1162002 
    and d.Absence <> 'Scheduled'
)
select CountFinal = count(*)
from cte
where date > dateadd(year,-1, getdate())
  and (Total >= 5 and Total < 6)
  and not (isnull(prev_total,0) >= 5 and isnull(prev_total,0) < 6)

sql server的哪个版本?@SqlZim我有2012这似乎是我要找的,而且你的测试仪看起来不错。如何在我的查询中使用您的解决方案?我没有存储所有这些数据的数据库表。我只是有这个sql查询。谢谢你,非常感谢你的帮助。@Aaron很乐意帮忙!
;with cte as (
  select 
     lngtimeid as Id
   , lngempid as EmployeeId
   , dtmdateapp as [Date]
   , stroccur as [Value]
   , x.Total
   , prev_total = lag(x.Total) over (order by lngtimeid)
  from [Attendance].[dbo].[timeuse] d
    cross apply (
      select total = sum(stroccur)
    from [Attendance].[dbo].[timeuse] i
    where i.dtmdateapp <= d.dtmdateapp 
      and i.dtmdateapp >= Dateadd(year,-1, d.dtmdateapp) 
      and i.lngempid = d.lngempid 
      and i.absence <> 'Scheduled'
    ) x
  where d.lngempid = 1162002 
    and d.Absence <> 'Scheduled'
)
select CountFinal = count(*)
from cte
where date > dateadd(year,-1, getdate())
  and (Total >= 5 and Total < 6)
  and not (isnull(prev_total,0) >= 5 and isnull(prev_total,0) < 6)