2015-09-10 3 views
0

Я хотел бы использовать GROUP BY и выберите значение, основанное на собственной агрегатной функции, аналогичной MIN, MAX и т.д.Как определить собственную собственную функцию агрегации SQL?

Например, учитывая данные ниже, я хотел бы, чтобы группа по id и получить X наличие, если какое-либо значение в GROUP BY является X, иначе вернуть ?, если оно содержится ... и т.д.

+------------+--------------+------+ 
| date  | availability | id | 
+------------+--------------+------+ 
| 2015-09-08 | Y   | 1 | 
| 2015-09-07 | Y   | 1 | 
| 2015-09-06 | X   | 1 | 
| 2015-09-05 |    | 1 | 
| 2015-09-04 | X   | 1 | 
| 2015-09-04 | Y   | 2 | 
| 2015-09-05 | Y   | 2 | 
| 2015-09-06 | Y   | 2 | 
| 2015-09-07 | Y   | 2 | 
| 2015-09-08 | Y   | 2 | 
| 2015-09-09 | ?   | 2 | 
+------------+--------------+------+ 

SELECT * FROM availability GROUP BY ID [....]

Желаемый выход:

+------------+--------------+------+ 
| date  | availability | id | 
+------------+--------------+------+ 
| 2015-09-08 | X   | 1 | 
| 2015-09-04 | ?   | 2 | 
+------------+--------------+------+ 
+0

[Нравится] (https://msdn.microsoft.com/en-us/library/ms182741.aspx) - хотя вы, вероятно, можете делать то, что хотите, с помощью 'count' /' sum' и 'case'. – Blorgbeard

+0

Вам нужно обратиться к сборке? Можете ли вы просто определить, что вы хотите с помощью функции SQL? – CodeOcelot

+0

Это зависит полностью от базы данных, которую вы не указали. –

ответ

0

Вы можете сделать это с помощью условной агрегации:

select id, 
     (case when sum(case when availability = 'X' then 1 else 0 end) > 0 
      then 'X' 
      else '?' 
     end) 
from availability a 
group by id; 

Ваш вопрос не уточняет, где дата приходит, поэтому я оставил его.

+0

Это умное решение. Ограничено ли оно двоичным выбором? Мне кажется, что он не может быть расширен до 'n' классификаций. – CodeOcelot

+0

@CodeOcelot. , , Вам нужно будет указать правила для комбинации. Однако это будет другой вопрос, поэтому задайте новый вопрос. –

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