web-dev-qa-db-fra.com

MAX (DATE) - SQL ORACLE

Je souhaite sélectionner uniquement la dernière appartenance id de la table user_payments De l'utilisateur avec l'ID utilisateur égal à 1.

Voici comment se présente la table 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 

J'essaie sans succès le code suivant:

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

Et je reçois cette erreur: Erreur SQL: ORA-00934: la fonction de groupe n’est pas autorisée ici 00934. 00000 - "La fonction de groupe n'est pas autorisée ici"

Comment puis-je le réparer? Merci d'avance!

8
Cristy
select * from 
  (SELECT MEMBSHIP_ID
   FROM user_payment WHERE user_id=1
   order by paym_date desc) 
where rownum=1;
16
manurajhada
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
)
9
shawnt00

Essayer: 

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

Ou:

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
3
A.B.Cade

Oracle 9i + (peut-être aussi 8i) a les fonctions d'agrégat FIRST/LAST, qui permettent d'effectuer des calculs sur des groupes de lignes en fonction du rang de la ligne dans le groupe. En supposant que toutes les lignes forment un groupe, vous obtiendrez ce que vous voulez sans sous-requêtes:

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
0
Andrew