Utilisateur avec la sélection plus tôt et se joindre à d'autres données
-
20-09-2019 - |
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?
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'