Моя таблица (@MyTable) представляет собой список идентификаторов с датами начала и датами окончания (включительно), которые представляют собой интервал дней, когда идентификатор появляется в файле, который принимается один раз в день:T-SQL наименьших наборов общих дат, включающих все идентификаторы строк
ID Start_Date End_Date
1 10/01/2014 12/15/2014
2 11/05/2014 03/03/2015
3 12/07/2014 12/09/2014
4 04/01/2015 04/15/2015
Каждый идентификатор появляется только один раз, т.е. только имеет один временной интервал, связанный, а интервалы между Start_Dates и End_dates может (но не обязательно) перекрытия между различными идентификаторами. Мне нужен SQL-запрос для поиска наборов дат, где каждый ID будет отображаться хотя бы один раз, когда файлы из этих наборов дат будут объединены в наименьшее количество дат, насколько это возможно. В таблице выше решения может быть эти 2 даты:
File_Date ID(s)
12/07/2015 1,2,3
04/01/2015 4
Но для примера любой 1 день между ID (3) «ы Дата_начала и end_date & в сочетании с 1 дня между ID (4)» ы start_date и End_date будет решением.
Фактические данные состоят из 10 000 различных идентификаторов. Диапазон дат возможных дат файла: 04/01/2014 - 07/01/2015. Каждый ежедневный файл очень большой по размеру и должен быть загружен вручную, поэтому я хочу свести к минимуму число, которое я должен загрузить, чтобы включить все идентификаторы.
До сих пор я КТР, что приводит в отдельных строках для всех дат между Дата_начала и датой_окончания каждого ID:
;WITH cte (ID, d)
AS
(
SELECT
tbl.ID AS ID,
tbl.Start_Date AS d
FROM @MyTable tbl
UNION ALL
SELECT
tbl.ID AS ID,
DATEADD(DAY, 1, cte.d) AS d
FROM cte
INNER JOIN
@MyTable tbl ON cte.ID = tbl.ID
WHERE cte.d < tbl.End_Date
)
SELECT
ID AS ID,
d AS File_Date
FROM cte
ORDER BY ID,d
OPTION (MaxRecursion 500)
Использование @MyTable примера результаты являются:
ID File_Date
1 10/01/2014
1 10/02/2014
1 10/03/2014
1 etc...
Мое мышление было определить наиболее распространенный File_Date среди всех идентификаторов, а затем выбрать следующий наиболее распространенный File_Date среди всех оставшихся идентификаторов и т. д. ... но я застрял. Чтобы выразить это более математически, я пытаюсь найти наименьшие множества (File_Dates), которые содержат все элементы (ID), похожие на https://softwareengineering.stackexchange.com/questions/263095/finding-the-fewest-sets-which-contain-all-items, но я не забочусь о минимизации дубликатов. Конечным результатам не нужно включать, какие идентификаторы появляются в файле File_Dates; Мне просто нужно знать все файлы File_Dates.
Я использую MS SQL Server 2008.
Этот тип оптимизации не является чем-то подходящим для SQL. Я думаю, что это может быть вариант кратчайшего пути. –
К сожалению, это единственный инструмент, который у меня под рукой ... Мне не нужно идеальное решение. Я могу переработать последние 10% при необходимости. – RCheskin