Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm tổng số phút bỏ qua trùng lặp (Chuyển đổi câu trả lời dựa trên con trỏ thành CTE)

Truy vấn sau đây tìm các khoảng thời gian trong dữ liệu, theo định nghĩa của bạn. Nó sử dụng các truy vấn con có tương quan trước để xác định xem một bản ghi có phải là thời điểm bắt đầu một khoảng thời gian hay không (nghĩa là không trùng lặp với các khoảng thời gian trước đó). Sau đó, nó chỉ định "periodStart" là lần bắt đầu gần đây nhất, là phần bắt đầu của khoảng thời gian không chồng chéo.

Truy vấn (chưa được kiểm tra) sau sử dụng cách tiếp cận này:

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 (Truy vấn thứ hai)

Nếu cả hai giai đoạn bắt đầu cùng một lúc, thì nó vẫn hoạt động, vì các giá trị AvailStart là như nhau. Do các truy vấn con tương quan, điều này có thể không hoạt động tốt trên các tập dữ liệu có kích thước trung bình.

Có những phương pháp khác để tiếp cận điều này. Ví dụ:nếu bạn có SQL Server 2012, bạn sẽ có thể sử dụng các hàm tính tổng tích lũy, cung cấp một phương pháp đơn giản hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi dữ liệu từ các hàng dựa trên một cột cụ thể sang một cấu trúc dữ liệu khác

  2. Đăng ký SSRS Email trùng lặp

  3. Làm cách nào để tạo bản tóm tắt bằng cách tham gia vào một bảng duy nhất với SQL Server?

  4. Chèn dữ liệu đối tượng lớn vào Salesforce.com từ SQL Server

  5. Tránh bế tắc SQL với điều chỉnh truy vấn:Lời khuyên từ Brent Ozar