2016-10-12 2 views
0

Предположим, у меня есть таблица значений вида:Как выбрать максимальное значение 2 раза?

Sample_Number | 
------------------- 
    1    | 
    1    | 
    2    | 
    3    | 
    3    | 
    4    | 
    5    | 

Как я могу написать заявление SELECT, чтобы вернуть максимальное количество образца, которое происходит ровно в 2 раза? В данных образца значение, которое я ищу, было бы 3.

Я предполагаю, что может быть несколько ответов на это - меня особенно интересует решение без внутренних выборок и которое использует предложение Have (если это возможно).

ответ

3

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

SELECT TOP 1 Sample_Number As MaxSampleNumberThatOccursTwice 
FROM dbo.TableName 
GROUP BY Sample_Number 
HAVING COUNT(*) = 2 
ORDER BY Sample_Number DESC 
+0

Он работает. Нет ли способа сделать это с помощью комбинации MAX (Sample_Number) и Count - избегая TOP и ORDER BY? –

+0

@ Mr.Blonde: только с подзапросом или sommon.table-выражением, как показано в других ответах. Но почему бы вам не использовать «ТОП-1»? –

+0

С точки зрения производительности - не заказывая данные. Что бы вы рекомендовали в качестве лучшего решения? Ваше предложение или предложение с подвыборкой? Может быть, это миллисекунды, но я стараюсь использовать наиболее эффективный sql во всех ситуациях. –

1
;with cte 
as 
(select sample_number 
from #temp 
group by Sample_Number 
having 
count(Analysis_ID)=2 
) 
select max(sample_number) from cte 
+0

Это возвратит как '1' и' 3' в результирующем из-за 'GROUP BY'. – Siyual

+0

Ваш ответ будет работать в моем предыдущем примере кода. Пожалуйста, посмотрите мои измененные образцы данных, так как я хотел бы сделать это без этого второго столбца (теперь удалено). –

+1

@Siyual fixed uit – TheGameiswar

3

Я уверен, что есть более простой способ сделать это, но вы можете сделать это, потянув все Sample_Number с ровно две записи, и потянув MAX() этих значений:

;With Cte As 
(
    Select Sample_Number 
    From Test 
    Group By Sample_Number 
    Having Count(Sample_Number) = 2 
) 
Select Max(Sample_Number) 
From Cte 
+0

Также рабочее решение. Какое решение следует выбрать с точки зрения производительности? –

+1

С точки зрения производительности я бы пошел с ответом Тима. Но и запросы CTE/Sub-select и 'TOP 1 ORDER BY' будут хорошими по производительности. – Siyual

0

Группа по Sample_Number и получить счетчик группы и выбрать только, если счетчик равен 2

select Sample_Number, count(*) count from someTable 
group by Sample_Number 
having count=2 
+0

Это вернет все номера образцов с count = 2. Мне нужно одно значение, а именно максимальное количество образцов. –

1

Я хотел бы использовать подзапрос:

SELECT MAX (sample_number) 
FROM (SELECT sample_number 
     FROM TAB1 
     GROUP BY sample_number 
     HAVING COUNT(sample_number) =2 
     ) 
+0

Это тоже работает. Однако я надеялся избежать подвыборки. –

+0

Почему? что не так в подвыборке? –

Смежные вопросы