2014-08-29 24 views
6

tôi sử dụng dưới đây truy vấn để tìm ra trung bình cho mỗi ngànhFinding trung bình trong máy chủ sql tối đa mỗi ngày trong bảng

SELECT DISTINCT Sector, 
    PERCENTILE_DISC(0.5) WITHIN 
GROUP (ORDER BY Value) OVER (PARTITION BY sector) AS Median 
FROM TABLE 

Bảng này là ở dưới dạng

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 
    A 2014-08-02 6 
    B 2014-08-02 5 
    C 2014-08-02 4 
    A 2014-08-03 3 
    B 2014-08-03 9 
    C 2014-08-03 6 
    A 2014-08-04 5 
    B 2014-08-04 8 
    C 2014-08-04 9 
    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 2 

Vì vậy, tôi có được dự kiến kết quả như bên dưới

Sector Median 
    A 5 
    B 7 
    C 6 

Bây giờ tôi cần phải thay đổi quy trình sao cho Người trung gian được tính toán trong khi chỉ có sự đồng ý đổ chuông các bản ghi tối đa ngày đã cho. Vì vậy, kết quả mới sẽ là

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 (Only 1 record each was considered for A, B and C) 

    A 2014-08-02 3.5 
    B 2014-08-02 5 
    C 2014-08-02 5.5 (2 records each was considered for A, B and C) 

    A 2014-08-03 3 
    B 2014-08-03 5 
    C 2014-08-03 6 (3 records each was considered for A, B and C) 

    A 2014-08-04 4 
    B 2014-08-04 6.5 
    C 2014-08-04 6.5 (4 records each was considered for A, B and C) 

    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 6 (All 5 records each was considered for A, B and C) 

Vì vậy, đây sẽ là loại trung bình tích lũy. Ai đó có thể cho tôi biết làm thế nào để đạt được điều này. Bảng của tôi có khoảng 2.3 triệu bản ghi với khoảng 1100 bản ghi cho mỗi khoảng 1100 ngày.

Vui lòng cho tôi biết nếu bạn cần bất kỳ thông tin nào.

Trả lời

1

Điều đó làm cho nó khó khăn hơn, bởi vì những điều sau đây không làm việc:

SELECT DISTINCT Sector, Date, 
     PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Value) OVER (PARTITION BY sector ORDER BY DATE) AS Median 
FROM TABLE; 

Alas. Bạn có thể sử dụng cross apply cho mục đích này:

select t.sector, t.date, t.value, m.median 
from table t cross apply 
    (select top 1 PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY t2.Value) OVER (PARTITION BY sector ORDER BY t2.DATE) AS Median 
     from table t2 
     where t2.sector = t.sector and t2.date <= t.date 
    ) m; 
+0

Kính gửi Ngài, Cảm ơn bạn. Điều này có vẻ hoạt động tốt trong tập dữ liệu thử nghiệm của tôi. Bây giờ tôi đang chạy nó với cái bàn khổng lồ. Cho phép hy vọng tất cả đều ổn. Cảm ơn rất nhiều vì sự giúp đỡ của bạn. – John

2

Một cách khác là tạo ra một tam giác JOIN để có được tất cả các giá trị trong quá khứ cho mỗi ngày và sử dụng như là dữ liệu

;With T AS (
    SELECT t2.Sector, t2.[Date], t1.[Value] 
    FROM Table1 t1 
     LEFT JOIN Table1 t2 ON t1.Sector = t2.Sector and t1.[Date] <= t2.[Date] 
) 
SELECT DISTINCT Sector 
    , [Date] 
    , PERCENTILE_CONT(0.5) 
     WITHIN GROUP (ORDER BY [Value]) 
     OVER (PARTITION BY sector, [Date]) AS Median 
FROM T 
ORDER BY [Date], Sector; 

SQLFiddle demo

Trong truy vấn tôi đã thay đổi PERCENTILE_DISC với PERCENTILE_CONT để có được trung vị phù hợp trong trường hợp số lượng giá trị thậm chí, ví dụ: ngày.

+0

Dear Sir, Cảm ơn bạn đã trả lời. Tôi đã thay đổi PERCENTILE_DISC thành PERCENTILE_CONT – John

Các vấn đề liên quan