|
|
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Всем привет, у меня есть таблица: table1 - id - (int) status - (int) quantity (количество чего-то в промежуток времени) - (date) start (начальная дата) - (date) end (конечная дата) Я создал вспомогательную таблицу для выборки по дням Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Хотя может я и зря это сделал, мне нужно теперь сгруппировать по дням первую таблицу чтоб посчитать количество за каждый день. Выбираю все даты в диапазоне: Код: sql 1. 2. 3. Группирую данные по статусу для конкретного дня Код: sql 1. 2. 3. 4. Вопрос: как вот этот конкретный день '2016-02-11' заменить на мою вспомогательную таблицу? Т.е. чтоб был вывод по всем дням в диапазоне. Или может вообще вспомогательная таблица не нужна и я куда-то не в те дебри зашел. Большое спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 10:39 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Знаете, было бы более разумно формулировать исходную задачу, а не свои попытки её решить. Причём сформулировать её точно и однозначно, чтобы не возникало дополнительных вопросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 10:44 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Akina, из таблицы table1 сгруппировать данные по дням (сумму столбца quantity) + status При этом таблица имеет структуру, описанную выше начальная дата, конечная, количество Код: sql 1. Код: sql 1. 2. 3. 4. 5. Это резервирование какого-то количества товара в промежуток дат. Нужно вывести для каждого дня в определенном диапазоне сколько в этот день зарезервировано unit с каким status Конечный вид, какой-то такой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 11:22 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Oldwin, какой должен быть результат, если: -в день икс не будет вообще ни одного юнита? -в день игрек по как минимум одному из статусов не будет ни одного юнита? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 11:51 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Если я верно понимаю, то группа (`unit`, `status`, `quantity`) уникальна в пределах таблицы, так? Тогда подход с формированием опорной таблицы вполне правильный. Единственное разве - не убеждён, что есть смысл создавать такую таблицу статической, да ещё на такой диапазон дат, я бы пошёл по пути получения нужных данных в хранимой процедуре, где создавал и заполнял бы таблицу дат только в нужном диапазоне по аналогии с вышеприведённым кодом (CREATE TEMPORARY TABLE dates () ENGINE=MEMORY) - во-первых, она компактная, без "лишних" данных, во-вторых, быстрая, в третьих, не надо заботиться об очистке. Ну а сам запрос при этом тривиален, типа: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 12:02 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
tanglir , Правильные вопросы, спасибо. автор-в день икс не будет вообще ни одного юнита? 0 автор-в день игрек по как минимум одному из статусов не будет ни одного юнита? не выводить ничего с этим статусом. Можно даже упростить задачу и выбирать только WHERE status = 2. Это не принципиально и я сам допишу, чтоб не нагружать уважаемых форумчан, у меня проблема с выборкой по каждому дню в диапазоне и комбинации дат. Akina , авторЕсли я верно понимаю, то группа (`unit`, `status`, `quantity`) уникальна в пределах таблицы, так? Нет. Допустим у нас есть unit #3 (это его id). Его много (допустим 100 штук, это не важно и хранится в другой таблице). Когда резервируется этот юнит #3 количеством 5 шт. в таблицу добавляется строка Код: sql 1. 2. 3 - юнит №3 2 - ID статуса 5 - количество (может быть любым числом) Начальная и конечная дата. Таких записей в данной таблице может быть неопределенное количество. Они указывают лишь диапазон в котором есть аренда данного юнита и его количество. При этом тот же юнит может быть в разных комбинациях количества в разные промежутки арендован. Где-то на один день, где-то на несколько. И все эти пересечения в разный день дают различное количество. Для конкретного дня его можно найти запросом, который я написал в первом сообщении, группировкой SUM(`quantity`) Код: sql 1. Вот как вот в эту {:дата:} подставить массив из необходимых дат (диапазон), чтоб не где-то в скрипте перебирать все даты, а получить один запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 12:25 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
OldwinПравильные вопросы, спасибо. автор-в день икс не будет вообще ни одного юнита? 0а статус тут какой должен быть? В принципе, задача-то простейшая: суммируем quantity с группировкой по date,status,unit, полученный результат left join-им или просто join-им к опорной таблице дат. Вопрос только в деталях отображения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 12:46 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Oldwin , это я перестарался. Тут неуникальность никак не влияет на итог, не обращай на это внимания. Ведь таблицу опорных дат ты создаёшь сам, и в ней дубликатов не будет. Oldwinполучить один запрос. Ну собсно так оно и есть. Только не запрос, а ХП... но в ней - один запрос на получение данных за все даты сразу. А т.к. создание и заполнение опорной таблицы диск не трогает, то временем на эти операции в первом приближении можно и пренебречь - вряд ли тебе потребуется генерация отчёта за сотню лет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 12:47 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
OldwinВот как вот в эту {:дата:} подставить массив из необходимых дат (диапазон), чтоб не где-то в скрипте перебирать все даты, а получить один запрос. Код: sql 1. 2. ну или не битвин, а 2 неравенства, если там не интервалы, а (полу)отрезки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 12:48 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
tanglir , Действительно, это же JOIN простой, спасибо ) Как-то так стало получаться: Код: sql 1. 2. 3. 4. 5. Akina , спасибо за подсказку с временной таблицей, но ее придется создавать каждый раз, а запросов таких много предполагается. Я так понимаю, самый оптимальный путь - хранить в памяти таблицу с датами? Она весит для всех нужных дат не много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 13:44 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Oldwinхранить в памяти таблицу с датами?Зачем в памяти, создайте (и заполните) её в БД. Это и сделать-то надо ровно один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 13:46 |
|
||
|
Группировка по дням в диапазоне
|
|||
|---|---|---|---|
|
#18+
Oldwinее придется создавать каждый раз, а запросов таких много предполагается Создание компактной временной таблицы на MEMORY движке выполнится ГОРАЗДО быстрее, чем чтение статической таблицы с диска, да ещё минус одно условие во WHERE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2016, 14:36 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1832194]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 461ms |

| 0 / 0 |
