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

Đường trung bình cửa sổ trong máy chủ sql

Loại bỏ phạm vi ngày được mã hóa cứng ra khỏi truy vấn của bạn. Ghi kết quả đầu ra (như mẫu của bạn ở cuối) vào bảng tạm thời (tôi gọi nó là #visits bên dưới).
Hãy thử tự nối với bảng tạm thời này:

 Select list.dtadmission
   , AVG(data.nvisits) as Avg
   , SUM(data.nvisits) as sum
   , COUNT(data.nvisits) as RollingDayCount
   , MIN(data.dtadmission) as Verifymindate
   , MAX(data.dtadmission)   as Verifymaxdate
 from  #visits as list 
 inner join #visits as data  
 on list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission) group by list.dtadmission

CHỈNH SỬA: Tôi không có đủ chỗ trong Nhận xét để trả lời câu hỏi của bạn:

Tham gia của tôi là "kinda cartesian" vì nó sử dụng một giữa trong ràng buộc tham gia. Mỗi bản ghi trong danh sách sẽ so sánh với mọi bản ghi khác, và sau đó tôi muốn những bản ghi mà ngày tôi báo cáo nằm trong giới hạn dưới (-7) ngày và hôm nay. Mỗi ngày dữ liệu đều có sẵn cho ngày niêm yết, đây là chìa khóa cho câu hỏi của bạn. Tôi có thể đã viết điều kiện tham gia là

list.dtadmission between DATEADD(DD,-6,data.dtadmission) and data.dtadmission

Nhưng điều thực sự xảy ra là tôi đã thử nghiệm nó với tư cách là

list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission

Không trả về bản ghi nào vì cú pháp là "Giữa THẤP và CAO". Tôi đã đối mặt với 0 bản ghi và hoán đổi các đối số, vậy thôi.

Hãy thử những điều sau, xem ý tôi là gì:Đây là phép nối cacte chỉ cho một ngày danh sách:

 SELECT 
 list.[dtAdmission] as listdate
 ,data.[dtAdmission] as datadate
 ,data.nVisits as datadata
 ,DATEADD(dd,6,list.dtadmission) as listplus6 
 ,DATEADD(dd,6,data.dtAdmission ) as datapplus6 
 from  [sandbox].[dbo].[admAvg] as list inner join [sandbox].[dbo].[admAvg] as data    
 on 
 1=1
 where list.dtAdmission = '5-Jan-2011'

So sánh điều này với điều kiện tham gia thực tế

 SELECT 
      list.[dtAdmission] as listdate
      ,data.[dtAdmission] as datadate
      ,data.nVisits as datadata
      ,DATEADD(dd,6,list.dtadmission) as listplus6 
      ,DATEADD(dd,6,data.dtAdmission ) as datapplus6
from  [sandbox].[dbo].[admAvg] as list   inner join [sandbox].[dbo].[admAvg] as data    
on 
list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission)
where list.dtAdmission = '5-Jan-2011'

Xem ngày danh sách giữa datadate và dataplus6 trong tất cả các bản ghi như thế nào?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có nên sử dụng! =Hoặc <> cho T-SQL không?

  2. Cách chọn mọi hàng trong đó giá trị cột KHÔNG bị phân biệt

  3. Tìm kiếm văn bản trong quy trình được lưu trữ trong SQL Server

  4. xếp tầng xóa gây ra nhiều đường dẫn tầng

  5. TSQL Thử / Bắt trong Giao dịch hay ngược lại?