Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdź łączną liczbę minut ignorując nakładanie się (konwertuj odpowiedź opartą na kursorze na CTE)

Poniższe zapytanie znajduje kropki w danych, zgodnie z twoją definicją. Najpierw używa skorelowanych podzapytań, aby określić, czy rekord jest początkiem okresu (to znaczy, czy nie nakłada się na wcześniejsze okresy). Następnie przypisuje "periodStart" jako najnowszy początek, który jest początkiem nienakładającego się okresu.

Poniższe (nieprzetestowane) zapytanie przyjmuje takie podejście:

with TimeWithOverlap as (
     select t.*,
            (case when exists (select * from dbo.Available tbefore where t.availStart > tbefore.availStart and tbefore.availEnd >= t.availStart)
                  then 0
                  else 1
             end) as IsPeriodStart
     from dbo.Available t 
    ),
    TimeWithPeriodStart as (
     select two.*,
            (select MAX(two1.AvailStart) from TimeWithOverlap two1 where IsPeriodStart = 1 and two1.AvailStart <= two.AvailStart
            ) as periodStart
     from TimeWithOverlap two
    )
select periodStart, MAX(AvailEnd) as periodEnd
from TimeWithPeriodStart twps
group by periodStart;

http://sqlfiddle.com/#!6/3483c/20 (Drugie zapytanie)

Jeśli dwa okresy zaczynają się w tym samym czasie, to nadal działa, ponieważ wartości AvailStart są takie same. Z powodu skorelowanych podzapytań może to nie działać zbyt dobrze nawet w przypadku średnich zestawów danych.

Istnieją inne metody podejścia do tego. Na przykład, jeśli masz SQL Server 2012, możesz użyć funkcji sumy zbiorczej, które oferują prostszą metodę.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić uniksową sygnaturę czasową w SQL Server (T-SQL)

  2. Jak podłączyć Sqlcmd do serwera?

  3. Procedura składowana działa, gdy jest uruchamiana ręcznie, nie działa z agenta serwera sql

  4. Samozamykające się znaczniki w XML w SQL Server

  5. Praktyczny wybór procesorów dla obciążeń SQL Server 2014/2016 OLTP