2016-02-09 3 views
1

I имеют следующие столбцы таблицы:Как достичь MAX (COUNT (имя_столбца))

CommunicationNumber, DayOfWeekSlot, TwoHourSlot 

Я хочу, чтобы подсчитать количество строк для каждого CommunicationNumber где DayOfWeekSlot и TwoHourSlot одинаковы. Из этого результата я хочу выбрать строку, в которой число (DayOfWeekSlot/TwoHourSlot) является самым высоким.

Я написал следующий запрос:

SELECT tblLog.CommunicationNumber, MAX(tblLog.Priority) AS Frequency, tblLog.DayOfWeekSlot, tblLog.TwoHourSlot 
FROM (SELECT CommunicationNumber, Count(*) AS Priority, DayOfWeekSlot, TwoHourSlot 
     FROM Miafon.dbo.tblPhoneLogRep 
     WHERE CallDuration > 0 
     GROUP BY CommunicationNumber, DayOfWeekSlot, TwoHourSlot) tblLog 
GROUP BY tblLog.CommunicationNumber, tblLog.DayOfWeekSlot, tblLog.TwoHourSlot 
ORDER BY tblLog.CommunicationNumber, Frequency DESC 

Этот запрос дает мне следующие столбцы:

CommunicationNumber, Frequency, DayOfWeekSlot, TwoHourSlot 

Так как группа I по CommunicationNumber, TwoHourSlot и DayOfWeekSlot, я получаю все строки, где эти значения отличаются (сортируются в порядке убывания частоты). Мне нужна только строка с наибольшим значением частоты.

Как это достичь?

+0

row_number() над .... – Paparazzi

+0

Что вы хотите 'Max (Count)', 'не Count (Макс)'. –

+0

Спасибо @StefanSteinegger. Исправлено название. – rahulthewall

ответ

2

Вы можете использовать row_number по этому вопросу, как это:

SELECT * FROM (
    SELECT tblLog.CommunicationNumber, tblLog.Priority AS Frequency, tblLog.DayOfWeekSlot, tblLog.TwoHourSlot 
    ,row_number() OVER (PARTITION BY tblLog.CommunicationNumber order by tblLog.Priority desc) as rnk 
    FROM (SELECT CommunicationNumber, Count(*) AS Priority, DayOfWeekSlot, TwoHourSlot 
      FROM Miafon.dbo.tblPhoneLogRep 
      WHERE CallDuration > 0 
      GROUP BY CommunicationNumber, DayOfWeekSlot, TwoHourSlot) tblLog) 
WHERE rnk = 1 
+0

Спасибо, я не знал о функции row_number(). Позвольте мне прочитать об этом и понять ваше решение. – rahulthewall

+0

Функция row_number() в основном оценивает каждую строку в соответствии с порядком, указанным вами в пометке. Вы можете использовать раздел для разделения каждой группы отдельно - как здесь, для каждого номера связи. и с порядком счета desc. таким образом, самый большой будет 1 @rahulthewall – sagi

+0

Спасибо @sagi, что работает. Вам просто нужно небольшое исправление в вашем синтаксисе ближе к концу, чтобы запрос работал правильно (по крайней мере, мне это нужно). GROUP BY CommunicationNumber, DayOfWeekSlot, TwoHourSlot) tblLog) tblRank WHERE tblRank.rnk = 1 – rahulthewall