2

这是一个名为 HIGHVALS 的 2 列表。我正在寻找 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

我很感谢大家的建议。

4

4 回答 4

4

如果您使用的是 SQL Server 2012 或更高版本,请考虑使用max() over ()窗口函数:

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 Fiddle 上的实时示例。

对于以前版本的 SQL Server,您可以使用 aleft join来计算PrevMax

select  count(*)
from    (
        select  max(prev.B) as PrevMax
        ,       min(cur.B) as B
        from    Table1 cur
        left join
                Table1 prev
        on      prev.A < cur.A
        group by
                cur.A
        ) as SubQueryAlias
where   B > PrevMax
        or PrevMax is null

SQL Fiddle 上的实时示例。

于 2013-08-18T13:58:30.940 回答
3

尝试这个:

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;

编辑:添加列 C。

结果:

C           HigherHighCount
----------- ---------------
21037       1
21039       4
21045       1
21048       10
21073       1

另请参阅小提琴示例

于 2013-08-18T14:42:39.337 回答
0

具有 group by col_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
于 2013-08-18T15:41:07.207 回答
0

使用 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
于 2013-08-18T15:20:59.180 回答