SQL chọn hàng theo ngày gần đây nhất


106

Sử dụng truy vấn và kết quả sau, tôi đang tìm mục nhập gần đây nhất trong đó ChargeId và ChargeType là duy nhất.

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

Mong muốn:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008

Câu trả lời:


147

Bạn có thể sử dụng GROUP BY để nhóm các mục theo loại và id. Sau đó, bạn có thể sử dụng hàm Tổng hợp MAX () để lấy tháng dịch vụ gần đây nhất. Phần dưới đây trả về tập hợp kết quả với ChargeId, ChargeType và MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
Đừng quên đặt bí danh cho trường MAX (serviceMonth) trong trường hợp bạn cần nó xuống dòng.
Ben Hoffstein

2
ok, vậy điều gì sẽ xảy ra nếu có hàng 101 N 1/1/2008 trong bảng?
tvanfosson

3
bạn sẽ nhận được thêm một hàng được trả lại. Đó là kết quả mong muốn dựa trên yêu cầu của anh ta.
Carlton Jenke

1
Đã thêm bí danh cho truy vấn trong bài đăng. tvanfosson - đó sẽ là một điều kiện được thêm vào tập kết quả, điều này đúng.
Người bán Mitchel

1
Nếu tôi muốn cũng kéo id bản ghi với nó. Tôi sẽ làm điều đó như thế nào?
Donny V.

58

Vì vậy, đây không phải là những gì người yêu cầu đang yêu cầu nhưng nó là câu trả lời cho "SQL chọn hàng theo ngày gần đây nhất".

Được sửa đổi từ http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth

2
Cảm ơn bạn! Đây là những gì tôi đang tìm kiếm!
Diana

Dường như không tương thích với các chế độ xem.
nuzzolilo

11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType

6

Tôi thấy hầu hết các nhà phát triển sử dụng truy vấn nội tuyến mà không biết nó ảnh hưởng đến dữ liệu lớn.

đơn giản, bạn có thể đạt được điều này bằng cách:

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc

1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

Truy vấn trên sẽ hoạt động nếu id phí riêng biệt có các kết hợp kiểu biểu đồ khác nhau. Hy vọng rằng truy vấn đơn giản này sẽ giúp giảm thiểu thời gian hiệu suất khi xem xét ...

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.