Sql server: нове рішення задачі упаковки інтервалів

Відео: Виробництво тари і упаковки. Бізнес ідея

Тестові дані для завдання упаковки інтервалів
SQL Server: нове рішення задачі упаковки інтервалів

Відео: Подарункова упаковка 10х15 см. Посилка з Китаю. AliExpress


Дивимося програмний код, наведений нижче. Як ми бачимо, кожен сеанс був активним протягом тимчасового інтервалу з часом початку і кінця, що зберігаються в стовпцях starttime і endtime відповідно. Завдання - упакувати групи пересічних інтервалів для кожного облікового запису. Таким чином, для кожної групи пересічних інтервалів передбачається повернути один безперервний інтервал- в якості початкового і кінцевого часу упакованого інтервалу передбачається використовувати мінімальне проміжок часу і максимальне кінцеве час в групі відповідно.

SQL Server: нове рішення задачі упаковки інтервалів
DDL і тестові дані (малий набір)

Відео: Правильна упаковка


SQL Server: нове рішення задачі упаковки інтервалів
Великий набір тестових даних

Для тестових даних в представленому коді бажаний результат показаний в таблиці нижче. Для перевірки продуктивності рішень необхідні більші набори тестових даних. Використовуйте програмний код, представлений вище, для заповнення таблиці Accounts 5 тисячами облікових записів, а таблиці Sessions - двома сотнями сеансів для кожного облікового запису (всього 1 млн сеансів). Ви можете змінити ці значення, щоб протестувати рішення з іншим числом рядків за вашим вибором.

SQL Server: нове рішення задачі упаковки інтервалів
Вихідні дані повного рішення

Відео: Лінія упаковки продукції в картонну упаковку


Нове рішення з використанням віконних агрегатів

Щоб підвищити продуктивність, можна створити єдиний допоміжний індекс, який впорядковує дані за ідентифікатором облікового запису, часу початку сеансу, часу завершення сеансу і, нарешті, ідентифікатором сеансу (якщо є два сеанси з однаковою обліковим записом, які почалися і завершилися в один і той же час). Використовуйте наступний програмний код для формування рекомендованого індексу:
CREATE UNIQUE INDEX idx_start_end ON dbo.Sessions (actid, starttime, endtime, sessionid) -

Наступний програмний код реалізує перший крок рішення:






SELECT *, MAX (endtime) OVER (PARTITION BY actid ORDER BY starttime, endtime, sessionid ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prvendFROM dbo.Sessions-

Для кожного сеансу обчислюється поточний максимум, щоб визначити максимальний час завершення до попереднього сеансу тієї ж облікового запису (назвемо результат prvend). У попередньому сеансі використовується наступний порядок: час початку, час завершення і ідентифікатор сеансу. Вихідні дані на кроці 1 для малого набору тестових даних показані в таблиці нижче. Природно, перший сеанс облікового запису не має відповідного попереднього сеансу, тому значення prvend для першого сеансу одно NULL.

SQL Server: нове рішення задачі упаковки інтервалів
Вихідні дані кроку 1




ІНШЕ

Sql server: пошук або сканування фото

Sql server: пошук або сканування

демонстраційні дані Демонстраційні дані для статті сформовані за допомогою коду, наведеного нижче. Код для створення…

» » Sql server: нове рішення задачі упаковки інтервалів