2012-07-09 21 views
8

Quiero seleccionar sólo la última membership_id de user_payments mesa del usuario con el user_id igual a 1.MAX (FECHA) - SQL ORACLE

Este es el aspecto de la tabla como user_payment:

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 

estoy intentando sin éxito el siguiente código:

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

Y me sale este error: SQL error: ORA-00934: la función de grupo no permitir que se ed aquí 00934. 00000 - "la función de grupo no está permitida aquí"

¿Cómo puedo solucionarlo? ¡gracias por adelantado!

Respuesta

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

Esta respuesta se correlaciona la subconsulta. No necesitará cambiar el argumento user_id en varios lugares y no tendrá que lidiar con la creación de múltiples parámetros si lo usa desde otro código. – shawnt00

3

Probar:

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

O:

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 por sugerir la función de clasificación row_number() como alternativa a la función de agregado MAX. Solo una forma diferente de atacar el problema. – Baodad

+0

mismo, la función de ranking row_number() me sirve bien – Ian

0

Oracle 9i + (tal vez 8i también) tiene primeras funciones agregadas LAST /, que hacen cálculos en grupos de filas de acuerdo al rango de la fila en el grupo. Suponiendo que todas las filas como un grupo, obtendrá lo que quiere sin subconsultas:

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

intento con:

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