ПредишенСледващото

Проблемът с намирането на пропуски и диапазони в SQL, често е необходимо да се реши ситуации от реалния живот. Основният принцип е, че имате определена последователност от числа или дата и час ценности, сред които трябва да се спазват определен интервал, но някои елементи липсват. пропуски Търсене Solution включва намирането на елементите, които липсват в последователността, както и обхвата на търсене - намиране на съседни диапазони на съществуващите ценности. За да се демонстрира техниката на изследователски пропуски и ленти I използват таблица име Т1 с числена последователност в COL1 на колона с разстояние, равно на една и таблица T2 с последователност на дата и време на метода в col1 колоната с интервал от един ден. Ето кода на създаване Т1 и Т2, и напълването им с данни за изпитване:

Както бе споменато по-рано, задачата за намиране пропуски откритие осигурява диапазони на липсващите стойности в последователността. За нашите данни от изпитания в Т1 изисква резултат за номериране е както следва:

Т-SQL, пропуски и диапазони

Но на желания резултат за поредица от етикетите на дати и часове в Т2:

Т-SQL, пропуски и диапазони

Проблемът с намирането на диапазони на обхвати на определяне предполага съществуващите ценности. Това са очакваните резултати за последователност на номерата:

Т-SQL, пропуски и диапазони

И тук е необходимата резултат за времевата последователност на датите:

Т-SQL, пропуски и диапазони

Един от най-ефективните решения за проблема търсене гама включва използването на класирането. Използвани функция DENSE_RANK да създаде поредица от числа в подреждането с col1 и изчислява разликата между col1 и "плътен клас» (drnk), нещо подобно на това;

Т-SQL, пропуски и диапазони

Имайте предвид, че в рамките на тази разлика е същата, както и че е уникален за всяка група. Това е така, защото col1 и drnk увеличение с един интервал. В прехода към следващите COL1 увеличава обхват от повече от един интервал, а drnk винаги увеличава от един интервал. Поради това, разликата в всеки следващ интервал е по-голяма от предишната. Поради факта, че тази разлика е същата и е уникален в рамките на всеки кръг, можете да го използвате като група за самоличност. Така че само групови редове в съответствие с тази разлика и да се върнат максималната и минималната стойност на col1 във всяка група:

Планът на това решение е показано по-долу:

Планът е много ефективна, тъй като изчисляването на индекса се използва плътна ранг поръчка въз основа на col1.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!