Существует ли установленный шаблон для запросов SQL, которые группируются по диапазону?

Я видел много вопросов по SO о том, как группировать данные по диапазону в SQL-запросе.

Конкретные сценарии различаются, но общая основная проблема в каждом из них заключается в группировке по диапазону значений, а не по каждому дискретному значению в столбце GROUP BY. Другими словами, для группировки с менее точной детализацией, чем та, которую вы храните в таблице базы данных.

Это часто возникает в реальном мире при создании таких вещей, как гистограммы, представления календаря, сводные таблицы и другие специальные отчеты.

Некоторые примеры данных (несвязанных таблиц):

|      OrderHistory       |       |         Staff        |                
---------------------------       ------------------------
|    Date    |  Quantity  |       |   Age     |   Name   |
---------------------------       ------------------------       
|01-Jul-2012 |     2      |       |    19     |   Barry  |
|02-Jul-2012 |     5      |       |    53     |   Nigel  |
|08-Jul-2012 |     1      |       |    29     |   Donna  |
|10-Jul-2012 |     3      |       |    26     |   James  |
|14-Jul-2012 |     4      |       |    44     |   Helen  |
|17-Jul-2012 |     2      |       |    49     |   Wendy  |
|28-Jul-2012 |     6      |       |    62     |   Terry  |
---------------------------       ------------------------

Теперь предположим, что мы хотим использовать столбец Dateтаблицы OrderHistoryдля группировки по неделям, т. е. 7 -дневных диапазонов. Или, возможно, сгруппировать Staffв 10-летние -возрастные диапазоны :

|       Week      |  QtyCount  |        |  AgeGroup | NameCount |         
--------------------------------        -------------------------
|01-Jul to 07-Jul |     7      |        |   10-19   |    1      |
|08-Jul to 14-Jul |     8      |        |   20-29   |    2      | 
|15-Jul to 21-Jul |     2      |        |   30-39   |    0      |
|22-Jul to 28-Jul |     6      |        |   40-49   |    2      |
--------------------------------        |   50-59   |    1      |
                                        |   60-69   |    1      |
                                        -------------------------

GROUP BY Date. и GROUP BY Ageсами по себе этого не сделают.

Наиболее распространенные ответы, которые я вижу (, ни один из которых последовательно не признается «правильным» ), заключаются в использовании одного или нескольких из:

  • набор CASEутверждений, по одному на группу
  • куча UNIONзапросов с разными пунктами WHEREдля каждой группы
  • поскольку я работаю с SQL Server,PIVOT()иUNPIVOT()
  • двухэтапный -запрос с использованием подпрограммы -select, временной таблицы или конструкции View

Существует ли установленный общий шаблон для обработки таких запросов?

9
задан Community 23 May 2017 в 11:56
поделиться