2012-07-09 15 views
8

voglio selezionare solo l'ultimo membership_id da user_payments tabella dell'utente con l'user_id uguale a 1.MAX (DATA) - SQL ORACLE

Questo è come l'user_payment tavolo assomiglia:

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 

sto provando senza successo il seguente codice:

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

E ottengo questo errore: SQL errore: ORA-00934: funzione di gruppo non è consentire qui 00934. 00000 - "la funzione di gruppo non è consentita qui"

Come posso risolvere il problema? Grazie in anticipo!

risposta

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

Questa risposta è correlato sottoquery. Non dovrai modificare l'argomento user_id in più punti e non dovrai occuparti della creazione di più parametri se lo utilizzi da un altro codice. – shawnt00

3

Prova:

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

Oppure:

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 per suggerire la funzione di classificazione row_number() come alternativa alla funzione di aggregazione MAX. Solo un modo diverso per attaccare il problema. – Baodad

+0

stesso, row_number() funzione di classifica mi serve bene – Ian

0

Oracle 9i + (forse 8I troppo) deve prima/funzioni di aggregazione scorso, che fanno calcolo su gruppi di righe secondo per classificare la fila in gruppo. Assumendo che tutte le righe come un gruppo, si ottiene ciò che si vuole senza sottointerrogazioni:

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

Prova con:

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