Trả về một tập kết quả có nhiều hàng dựa trên ngày tối đa


16

Tôi có một bảng con giống như thế này:

[Bảng ngày lưu giữ]

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 |
|           1 | 2012-03-31 |   50.00 |
|           2 | 2012-04-30 |    0.00 |
|           2 | 2012-03-31 |   10.00 | 
|           3 | 2012-03-31 |   60.00 |
|           3 | 2012-02-29 |   10.00 |

Tôi muốn có thể nhận được một tập kết quả như thế này - một bản ghi cho mỗi khách hàng có ngày mới nhất:

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 | 
|           2 | 2012-04-30 |    0.00 |
|           3 | 2012-03-31 |   60.00 |

Tôi biết rằng tôi có thể làm điều này cho từng "ID khách hàng" riêng lẻ với SQL (cú pháp máy chủ SQL) sau:

select top 1  [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc


| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           2 | 2012-04-30 |    0.00 |

Nhưng tôi không chắc làm thế nào để có được cả ba hồ sơ tôi muốn. Tôi không chắc đây có phải là tình huống yêu cầu truy vấn phụ hay không.

Xin lưu ý rằng ngày tối đa có thể khác nhau đối với bất kỳ [ID khách hàng] nào, (trong ví dụ này, ngày tối đa của khách hàng 3 là 2012-03-31 trong khi các hồ sơ khác có ngày tối đa là 2012-04-30). Tôi đã thử

select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance 
from [Cust Date Table] 
group by [Customer ID], Balance; 

Vấn đề là điều này không trả về chỉ một hàng cho mỗi khách hàng - nó trả về nhiều hàng.

Câu trả lời:


18

Bạn chỉ muốn

SELECT
    [Customer ID],
    MAX([Some Date]) AS[Latest Date]
FROM[Cust Date TABLE]
GROUP BY
    [Customer ID];

Ok - bạn đã sửa đổi nó. Bây giờ bạn muốn đặt hàng và chọn hàng đầu:

WITH numbered AS (
    SELECT
        [Customer ID],
        [Some Date],
        [Balance],
        ROW_NUMBER() OVER (
            PARTITION BY
                [Customer ID]
            ORDER BY
                [Some Date] DESC
        ) AS rownum
    FROM[Cust Date TABLE]
)
SELECT
    [Customer ID],
    [Some Date],
    [Balance]
FROM numbered
WHERE
    rownum = 1;

Oh - bạn đã thay đổi câu hỏi?
Rob Farley

Thay đổi câu trả lời của tôi bây giờ.
Rob Farley

Một ưu điểm (hoặc nhược điểm, tùy thuộc vào yêu cầu của bạn) của giải pháp này là nếu ngày mới nhất xảy ra ở nhiều hàng cho cùng một khách hàng, nó sẽ không tạo ra kết quả trùng lặp.
Tim

7

Tôi nghĩ rằng bạn đang theo đuổi một cái gì đó như thế này

select c.[customer ID], [some date], balance
from [cust date table] c
inner join 
    ( select [customer ID], MAX([some date]) as maxdate
    from [cust date table]
    group by [customer ID]) c2
on c2.[customer ID] = c.[customer ID]
and c2.maxdate = c.[some date]

Có một số biến thể về điều này, ví dụ CTE, biến bảng, #table, mà bạn có thể chơi xung quanh để xem điều gì mang lại cho bạn hiệu suất tốt nhất trong tình huống của bạn.


Câu trả lời này cũng đúng. Thật không may, tôi không có đủ đại diện để nâng cấp nó và tôi phải chọn một câu trả lời.
Joe DBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.