Сумасшедший вопрос по SQL:Как сделать своего рода перекрестное применение с опорной точкой?
-
18-09-2019 - |
Вопрос
У клиента есть ярлыки в своих данных, где у него есть количество записей в поле.Когда я их анализирую, мне нужно создать записи, по одной для каждого количества, увеличивая «идентификатор» на 7 дней (поскольку число представляет дату.
Пример:один продукт продается в течение четырех недель, и мне нужно четыре записи, по одному продукту на каждую неделю.
[Номер события]
[Классификация]
[Недели идут]
[Некоторые данные]
2009 11 29 00
1
1
продлится одну неделю
2009 12 06 00
2
1
продлится одну неделю
2009 12 13 00
1
4
продлится четыре недели
2009 12 20 00
2
4
продлится четыре недели
Каким-то образом мне нужно превратить эти данные в следующее с помощью представления (sql select) (все в одной таблице, пробелы включены для просмотра частей:
[Номер события + Классификация]
[Некоторые данные]
2009 11 29 01
работает одну неделю Одна неделя, таким образом, один рекорд.
2009 12 06 02
работает одну неделю
2009 12 13 01
работает четыре недели Повторяется 4 раза, увеличивая дату на 7.
2009 12 20 01
работает четыре недели
2009 12 27 01
работает четыре недели
2009 01 03 01
работает четыре недели
2009 12 20 02
работает четыре недели Повторяется 4 раза, увеличивая дату на 7.
2009 12 27 02
работает четыре недели
2009 01 03 02
работает четыре недели
2009 01 10 02
работает четыре недели
Я думаю, что нужно использовать какой-то сводный перекрестный код SQL?
Решение
У меня есть для вас дешевый ответ.Вы используете «предварительно отрендеренный» Weeks
table для создания цикла на основе запроса.Вам потребуется потратить на это достаточно недель, чтобы охватить ожидаемый диапазон сценариев.
[Week]
1
2
3
4
Затем вы присоединяетесь к своему запросу на [Weeks Running]
к этой таблице, используя неравенство OriginalTable.WeeksRunning <= Weeks.Week
.В итоге у вас получится одна строка в неделю.
Вы определяете дату, добавляя Weeks.Week * 7
дней до даты, указанной в номере вашего мероприятия.
Другие советы
Вероятно, это будет проще сделать на стороне приложения, а не на стороне базы данных, но я попробую...Для этого требуется база данных, поддерживающая CTE, которой у меня нет под рукой, поэтому это не проверено.
WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
SELECT eventNumber, classification, 1, weeksRunning, someData
FROM originalTable
WHERE weeksRunning > 0
UNION ALL
SELECT eventNumber + 7, classification, index + 1, count, someData
FROM expandedTable
WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;