Sql server TSQL-需要“更高高点”计数

Sql server TSQL-需要“更高高点”计数,sql-server,tsql,counting,Sql Server,Tsql,Counting,这是一个名为HIGHVALS的两列表。我正在寻找TSQL来计算B列中较高高点的数量。第1行从1开始计算。第2行的计数为2,因为1525.34大于1520.08。第3行和第4行不参与计数,因为它们都小于最后一个最高值1525.34。第5行有助于计数,因为1543.47大于最后一个最高值1525.34。计数的最终结果应该是14 A, B 1, 1520.08 2, 1525.34 3, 1519.99 4, 1525.27 5, 1543.47 6, 1545.

这是一个名为HIGHVALS的两列表。我正在寻找TSQL来计算B列中较高高点的数量。第1行从1开始计算。第2行的计数为2,因为1525.34大于1520.08。第3行和第4行不参与计数,因为它们都小于最后一个最高值1525.34。第5行有助于计数,因为1543.47大于最后一个最高值1525.34。计数的最终结果应该是14

A,  B  
1,  1520.08  
2,  1525.34  
3,  1519.99  
4,  1525.27  
5,  1543.47  
6,  1545.25  
7,  1545.78  
8,  1552.48  
9,  1556.27  
10, 1556.77  
11, 1556.39  
12, 1563.32  
13, 1563.62  
14, 1560.7  
15, 1557.25  
16, 1561.56  
17, 1558.71  
18, 1557.74  
19, 1564.91  
20, 1563.95  
21, 1564.07  
22, 1570.28  
23, 1570.57  
24, 1573.66  
向此添加最后一项。表中有多个上述实例。列C提供分组依据的唯一键。在增加C栏的基础上,我能得到更多的指导吗?与以前相同的要求,只计算B列中较高的高点,但现在按C列分组

COL_A,COL_B,COL_C
21037,1345.00,21037
21038,1341.29,21037
21039,1357.7,21039
21040,1357.26,21039
21041,1365.36,21039
21042,1375.26,21039
21043,1380.39,21039
21044,1376.51,21039
21045,1362.34,21045
21046,1351.53,21045
21047,1343.98,21045
21048,1363.13,21048
21049,1389.18,21048
21050,1391.74,21048
21051,1387.16,21048
21052,1385.03,21048
21053,1375.13,21048
21054,1394.16,21048
21055,1399.63,21048
21056,1407.14,21048
21057,1404.14,21048
21058,1405.95,21048
21059,1405.98,21048
21060,1405.87,21048
21061,1410.03,21048
21062,1407.73,21048
21063,1417.43,21048
21064,1418.71,21048
21065,1418.13,21048
21066,1426.68,21048
21067,1416.12,21048
21068,1413.49,21048
21069,1413.46,21048
21070,1416.17,21048
21071,1413.63,21048
21072,1413.95,21048
21073,1410.08,21073

我感谢大家的建议

> P>如果你在SQL Server 2012或更高,考虑最大过窗口函数:

select  count(*)
from    (
        select  max(B) over (order by A rows between
                             unbounded preceding and 1 preceding) as PrevMax
        ,       B
        from    Table1
        ) as SubQueryAlias
where   B > PrevMax -- Larger than previous maximum
        or PrevMax is null -- Or first row
对于SQL Server的早期版本,可以使用左联接计算PrevMax:

试试这个:

SELECT t.C, HigherHighCount = COUNT(*)
FROM Table1 t
WHERE NOT EXISTS(SELECT * FROM Table1 WHERE [A] < t.[A] AND [B] > t.[B] AND [C] = t.[C])
GROUP BY t.C;
另请参见。

使用CTE替代方案:

;WITH Table1WithMaxPrevEntries AS
(   
    SELECT *, 
        ISNULL((select MAX(prev.b) FROM Table1 previous WHERE previous.a < [current].a ), 0) AS PreviousB_Max
    FROM Table1 AS [current]
)
SELECT COUNT(*)
FROM Table1WithMaxPrevEntries 
WHERE b > PreviousB_Max

根据COLU c集团的额外要求

select col_c, count(*) 
from 
(
    select s2.A
      from table s1 with (nolock) 
      join table s2 with (nolock) 
        on s2.A > s1.A
           and s2.col_c = s1.col_c 
     group by s1.col_c, s2.A, s2.B
    having s2.B > max(s1.B)
) ccount

约翰·杜威——这很有效。正是我所需要的,谢谢你。我发现了一个我想调整的情况。当列表中的两个连续值完全相同且第一个值较高时,将增加这两个值的计数。由于值完全相同,因此实际上应该只将连续的重复项计为1。有没有办法调整SQL,使其只计算一次?
;WITH Table1WithMaxPrevEntries AS
(   
    SELECT *, 
        ISNULL((select MAX(prev.b) FROM Table1 previous WHERE previous.a < [current].a ), 0) AS PreviousB_Max
    FROM Table1 AS [current]
)
SELECT COUNT(*)
FROM Table1WithMaxPrevEntries 
WHERE b > PreviousB_Max
select col_c, count(*) 
from 
(
    select s2.A
      from table s1 with (nolock) 
      join table s2 with (nolock) 
        on s2.A > s1.A
           and s2.col_c = s1.col_c 
     group by s1.col_c, s2.A, s2.B
    having s2.B > max(s1.B)
) ccount