2012-07-09 14 views
8

Chcę wybrać tylko najnowsze membership_id z user_payments stołowych od użytkownika z user_id równej 1.MAX (data) - SQL ORACLE

ten sposób user_payment tabela wygląda następująco:

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 

próbuję bezskutecznie następujący kod:

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

i dostaję ten błąd: SQL Error: ORA-00934: funkcja grupa nie ma umożliwić ed tutaj 00934. 00000 - "funkcja grupowa jest tutaj zabroniona"

Jak mogę to naprawić? z góry dziękuję!

Odpowiedz

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

Ta odpowiedź koreluje z podzapytania. Nie będziesz musiał zmieniać argumentu identyfikator_użytkownika w wielu miejscach i nie będziesz musiał zajmować się tworzeniem wielu parametrów, jeśli użyjesz go z innego kodu. – shawnt00

3

Spróbuj:

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); 

Lub:

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 za sugerowanie funkcji rankingu row_number() jako alternatywy dla funkcji agregującej MAX. Po prostu inny sposób na zaatakowanie problemu. – Baodad

+0

sama funkcja rankingowa row_number() dobrze mi służy – Ian

0

Oracle 9i + (może 8i też) ma pierwszą/ostatnią funkcje agregujące, które sprawiają, że obliczenia na grupach wierszy według do pozycji wiersza w grupie. Zakładając, że wszystkie wiersze w jednej grupie, dostaniesz co chcesz bez podzapytaniami:

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

Spróbuj z:

select TO_CHAR(dates,'dd/MM/yyy hh24:mi') from ( SELECT min (TO_DATE(a.PAYM_DATE)) as dates from user_payment a)