Учитывая следующие данные:
id | user_id | started | closed | dead
-------------------------------------------------------------------------------------------
7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL
7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07
13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57
13192 | 259140 | 2015-03-17 10:12:17 | NULL | 2015-03-18 11:46:46
13194 | 259140 | 2015-03-17 10:12:53 | NULL | 2015-03-18 11:46:36
14020 | 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 | NULL
17124 | 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 | NULL
19690 | 238846 | 2015-05-15 13:17:31 | NULL | 2015-05-27 13:56:43
20038 | 242650 | 2015-05-19 15:38:17 | NULL | NULL
20040 | 242650 | 2015-05-19 15:39:58 | NULL | 2015-05-21 12:01:02
20302 | 242650 | 2015-05-21 13:09:06 | NULL | NULL
20304 | 242650 | 2015-05-21 13:09:54 | NULL | NULL
20306 | 242650 | 2015-05-21 13:10:19 | NULL | NULL
20308 | 242650 | 2015-05-21 13:12:20 | NULL | NULL
21202 | 238846 | 2015-05-29 16:47:29 | NULL | NULL
21204 | 238846 | 2015-05-29 16:47:56 | NULL | NULL
21208 | 238846 | 2015-05-29 17:05:15 | NULL | NULL
21210 | 238846 | 2015-05-29 17:05:55 | NULL | NULL
21918 | 242650 | 2015-06-04 17:04:29 | NULL | 2015-06-12 15:47:23
Мне нужно создать набор данных, который соответствует следующим правилам:
- Группы определяются в первую очередь,
user_id
поэтому мы должны сравнивать только записи из того жеuser_id
- Все записи, которые начались по крайней мере в течение 15 дней после начала, закрытия или прекращения действия любой другой записи, должны учитываться как группа.
- Конец каждой группы должен рассчитываться как первая закрытая запись или все записи имеют значение для мертвых, и мы берем наибольшую дату мертвого столбца.
- Если запись не началась в течение 15 дней с начала или конца другой группы, то начинается новая группировка.
Ориентировочно, я считаю, что мои данные должны выглядеть так:
user_id | начал | конец -------------------------------------------------- ---- 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 242650 | 2015-05-21 13:09:06 | ЗНАЧЕНИЕ NULL 238846 | 2015-05-15 13:17:31 | ЗНАЧЕНИЕ NULL
Может ли кто-нибудь дать несколько советов о том, как построить запрос для удовлетворения этих условий?
Вот ссылка на операторы DDL и DML для данных, представленных в этом вопросе.
В качестве альтернативы, мы могли бы пропустить правила № 2 и № 4 и более просто заявить, что должны быть включены только записи, которые перекрывают друг друга. Более важное правило заключается в том, что в данном наборе, если есть закрытая дата, она становится концом набора, а не самой большой мертвой датой.
Ответы:
Из-за отсутствия ясности в вопросе я предложил четыре различных решения. Решения различаются по:
Обратите внимание, что это делается в SQL Server, а не в MySQL. Помимо некоторых незначительных изменений синтаксиса, он должен работать так же.
Общая настройка и пример данных для всех четырех методов
1. Каскадирование - использование решения ЗАКРЫТОЙ ЗАПИСИ
Это решение, которое, я считаю, ищущий ищет и соответствует своим результатам.
2. НЕ КАСКАДИНГ - ИСПОЛЬЗОВАНИЕ ЗАКРЫТОГО ЗАПИСИ
Начало рассчитывается по первой закрытой дате, когда она доступна, затем по самой ранней дате начала.
3. НЕ каскадирование - использование решения с самой ранней датой
Начало рассчитывается только по самой ранней дате.
4. Каскадирование - использование решения с самой ранней датой
Начало рассчитывается только по самой ранней дате.
источник
Я обеспокоен тем, что у нас может не быть четкой картины того, как определяется группа. Я говорю это только потому, что в зависимости от некоторых неустановленных условий вышеприведенные даты будут либо образовывать одну гигантскую группу, либо 3 группы, в которых одна группа доминирует над множеством.
Отсутствуют условия группировки?
1) Правильно ли это правило 15 дней? Если запись
Y
начинается через 10 дней после другой записиX
, а затем через 10 дней начинается другая запись , тоZ
образует ли это одну группу из трех записейX,Y,Z
или две группы, каждая из которых содержит две записи,X,Y
иY,Z
? Я сделал предположение, что правила 15 дней каскадно образуют большие группы.2) Являются ли даты включительно? Например, если одна запись имеет дату начала, а затем мертвую дату спустя много месяцев, все ли дни в этом диапазоне объединяются в группу? Я рассматриваю обе возможности в своем кратком анализе ниже.
Потенциальные группировки
Итак, если мы начнем с id
7714
, мы увидим, что начальная дата 1/27. Очевидно, что следующая запись,7882
начинающаяся с 1/28, попадает в эту группу. Однако обратите внимание, что это7882
заканчивается 5/15, поэтому все, что начинается в течение 15 дней с 5/15, должно быть добавлено в группу.Таким образом,
19690
через21210
get добавляются в группу, что посредством каскадирования приводит к21918
последующему добавлению в группу. Каскадирование поглотило почти все записи в наборе. Назови этоGROUP A
.Однако, если группировка также включает в себя дату, все записи от
13190
до17124
должны также принадлежатьGROUP A
, и теперь все идентификаторы находятся в одной группе.Если даты из
GROUP A
не включены, но на самом деле строго придерживаться '15 дня после»правил с каскадом, то вместо этого вы бы иметь вторую группу , состоящую из13190
через14020
, и третью группу с одним входом,17124
.По сути, мой вопрос заключается в том, соответствуют ли какие-либо из них предполагаемой группировке, или в определении группы отсутствует какая-либо другая информация? Я извиняюсь за такой многословный ответ, но, похоже, ваш предварительный запрос не соответствует определению вашей группы.
С разъяснениями, я уверен, что мы можем решить эту проблему.
источник