2013-08-18 2 views
2

Вот таблица с двумя столбцами под названием HIGHVALS. Я ищу TSQL для подсчета числа высших максимумов в столбце B. Строка 1 запускает подсчет в 1. В строке 2 счет равен 2, потому что 1525.34 составляет> 15-20.08. Строки 3 и 4 не вносят вклад в счет, потому что оба они являются последним самым высоким значением. Строка 5 способствует подсчету, потому что 1543.47>> 1525.34 последнее самое высокое значение. Конечным результатом подсчета должно быть 14.TSQL - Требуется кол-во «Высшие максимумы»

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, но теперь группа на колонке С.

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 

Я ценю предложения всех.

ответ

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; 

EDIT: добавление столбца C.

Результаты:

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

Также см fiddle example.

+0

John Dewey - отлично сработал. Именно то, что мне нужно, и я благодарю вас. –

+0

Я нашел ситуацию, которую я бы хотел настроить. Когда два последовательных значения в списке точно совпадают, а первый - более высокий, он увеличивает счетчик для обоих. Поскольку значения точно совпадают, он должен действительно считать только смежные дубликаты как 1. Есть ли способ настроить SQL, чтобы он только учитывал его один раз? –

+0

Не думаю, я это понял. [B]> = t. [B] –

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 

Live example at SQL Fiddle.

Для предыдущих выпусков SQL Server, можно использовать left 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 

Live example at SQL Fiddle.

+0

Это было полезно Andomar спасибо. –

0

использованием КТР альтернатива:

;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 
0

с требованием присоединения группы по 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