2012-07-09 49 views
8

Tôi muốn chỉ chọn membership_id mới nhất từ ​​bảng user_payments của người sử dụng với user_id bằng 1.MAX (NGÀY) - SQL ORACLE

Đây là cách user_payment bảng trông giống như:

PAYM_ID USER_ID MEMBSHIP_ID PAYM_DATE      
---------- ---------- ----------- ------------------------------- 
     1   1   1 18-DEC-09 12.00.00.000000000 AM 
     2   1   2 18-DEC-10 12.00.00.000000000 AM 
     3   1   2 18-DEC-11 12.00.00.000000000 AM 
     4   2   3 17-MAR-11 12.00.00.000000000 AM 
     5   3   3 18-JUN-12 12.00.00.000000000 AM 
     6   4   2 17-FEB-12 12.00.00.000000000 AM 
     7   5   2 18-FEB-11 12.00.00.000000000 AM 
     8   5   2 18-FEB-12 12.00.00.000000000 AM 
     9   6   1 01-JUN-12 12.00.00.000000000 AM 
     10   7   1 03-FEB-11 12.00.00.000000000 AM 
     11   7   2 03-FEB-12 12.00.00.000000000 AM 

tôi đang cố gắng không thành công đoạn mã sau:

SELECT MEMBSHIP_ID 
FROM user_payment 
WHERE user_id=1 and MAX(paym_date); 

Và tôi nhận được lỗi này: SQL lỗi: ORA-00.934: chức năng nhóm không cho phép là ed tại đây 00934. 00000 - "chức năng nhóm không được phép ở đây"

Làm cách nào để khắc phục sự cố? cảm ơn trước!

Trả lời

14
select * from 
    (SELECT MEMBSHIP_ID 
    FROM user_payment WHERE user_id=1 
    order by paym_date desc) 
where rownum=1; 
7
SELECT p.MEMBSHIP_ID 
FROM user_payments as p 
WHERE USER_ID = 1 AND PAYM_DATE = (
    SELECT MAX(p2.PAYM_DATE) 
    FROM user_payments as p2 
    WHERE p2.USER_ID = p.USER_ID 
) 
+1

Câu trả lời này tương quan subquery. Bạn sẽ không cần phải thay đổi đối số user_id ở nhiều nơi và bạn sẽ không phải đối phó với việc tạo nhiều tham số nếu bạn sử dụng nó từ mã khác. – shawnt00

3

Hãy thử:

SELECT MEMBSHIP_ID 
    FROM user_payment 
WHERE user_id=1 
ORDER BY paym_date = (select MAX(paym_date) from user_payment and user_id=1); 

Hoặc:

SELECT MEMBSHIP_ID 
FROM (
    SELECT MEMBSHIP_ID, row_number() over (order by paym_date desc) rn 
     FROM user_payment 
    WHERE user_id=1) 
WHERE rn = 1 
+0

+1 để đề xuất hàm xếp hạng row_number() làm hàm thay thế cho hàm tổng hợp MAX. Chỉ là một cách khác để tấn công vấn đề. – Baodad

+0

cùng, hàm xếp hạng row_number() phục vụ tôi tốt – Ian

0

Oracle 9i + (có thể 8I quá) có FIRST/LAST chức năng tổng hợp, mà làm cho tính toán trên các nhóm hàng theo xếp hạng của hàng trong nhóm. Giả sử tất cả các hàng như một nhóm, bạn sẽ nhận được những gì bạn muốn mà không cần truy vấn con:

SELECT 
    max(MEMBSHIP_ID) 
    keep (
     dense_rank first 
     order by paym_date desc NULLS LAST 
) as LATEST_MEMBER_ID 
FROM user_payment 
WHERE user_id=1 
-1

Hãy thử với:

select TO_CHAR(dates,'dd/MM/yyy hh24:mi') from ( SELECT min (TO_DATE(a.PAYM_DATE)) as dates from user_payment a) 
Các vấn đề liên quan