Question

J'ai une base de données Oracle où je suis en train de sélectionner un champ de user de la première ligne (basée sur un champ de time) lorsque certaines conditions sont remplies, et je ne sais pas comment le faire. Voici l'essentiel de ma requête:

SELECT id,
       CASE WHEN value = 'xyz'
            THEN 'Pending'
            ELSE 'Not Pending'
       END AS status,
       time
FROM table1
INNER JOIN ...
WHERE subject IN (...) AND
      field = 'Status'

Mon problème est que je ne sais pas comment sélectionner user et obtenir que la valeur de la ligne avec la première valeur time correspondant aux conditions WHERE. Je ne pense pas que je peux utiliser HAVING puisque je ne fais pas de fonctions d'agrégation dans mon SELECT. La condition « première valeur de time » doit appliquer uniquement à la sélection du champ user, à savoir que je veux id et value à sélectionner pour toutes les valeurs du champ time.

Je pensais que je pouvais garder l'instruction SELECT ci-dessus je puis JOIN avec une autre instruction SELECT qui obtient le user particulier que je veux.

SELECT id, status, time, user
FROM (
       ...query above...
     ),
     (
       SELECT user
       FROM table1
       WHERE subject in (...) AND
             field = 'Status' AND
             ROWNUM = 1
       ORDER BY time ASC
     )

Cependant, cela n'obtient une valeur pour user globale, et il devrait y avoir une valeur user distincte pour chaque id cochés à ma première requête. Comment puis-je limiter ma requête SELECT user par l'autre champ de id de requête? Est-ce même la bonne approche pour obtenir ce que je veux?

Était-ce utile?

La solution

SELECT  id,
        CASE WHEN value = 'xyz'
             THEN 'Pending'
             ELSE 'Not Pending'
        END AS status,
        time,
        FIRST_VALUE(user) OVER (PARTITION BY id ORDER BY time) AS first_user
FROM    table1
INNER JOIN
        ...
WHERE   subject IN (...) AND
        field = 'Status'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top