0
votes

Comment obtenir la ligne d'un ensemble de lignes avec la date la plus élevée en SQL?

SELECT AnotherID, text
FROM Table1
WHERE updateDate<=(SELECT versionDate FROM Table2 WHERE ID=1) 

4 commentaires

Double possible de SQL sélectionner uniquement les lignes avec une valeur maximale sur un colonne


J'ai ajouté MAX (updateDate) et groupé par Another ID maintenant il me montre le texte de la ligne 1 avec la date de la ligne 2


Pourquoi correspondez-vous à la date à laquelle vous sélectionnez en fonction de l'ID. Votre jeu de résultats correspond à ce que vous demandez dans la requête: à savoir, sélectionnez tous les enregistrements où la updateDate est inférieure ou égale à la versionDate de l'enregistrement dans Table2 (qui a la plus grande date / heure.


@Grevak. . . Je soupçonne que vous voulez la date de mise à jour la plus récente au plus tard à la date de la version. Si tel est le cas, la réponse actuellement acceptée n'est pas correcte.


4 Réponses :


1
votes

Vous pouvez essayer ceci.

SELECT AnotherID, text
FROM Table1 AS T1 
INNER JOIN (
    SELECT ANOTHERID, MAX(UPDATEDDATE) AS UPDATEDDATE 
    FROM TABLE1 GROUP BY ANOTHERID) AS T2 
ON T1.ANOTHERID=T2.ANOTHERID AND T1.UPDATEDDATE = T2.UPDATEDDATE  
WHERE T1.updateDate<=(SELECT versionDate FROM Table2 WHERE ID=1) 


0 commentaires

1
votes

La partie importante ici est que vous devez d'abord saisir la date maximale pour chaque AnotherID, puis joindre ces données à Table1 pour récupérer le texte, quelque chose comme ceci:

SELECT 
  AnotherID, text
FROM
  Table1
  JOIN (
        SELECT
          AnotherID, max(updateDate) as mud
        FROM
          Table1
        WHERE
          updateDate <= (SELECT versionDate FROM Table2 WHERE ID=1)
        GROUP BY
          AnotherID
  ) highdate ON (Table1.AnotherID = highdate.AnotherID 
                 AND
                 Table1.updateDate = highdate.mud);

Votre question est un peu vague sur la façon dont vous voulez filtrer les lignes qui sont supérieures à la versionDate, vous pouvez donc déplacer cette clause where après la jointure, mais sinon, ce qui précède devrait fonctionner.


0 commentaires

0
votes

Requête :

| AnotherID |  text |
|-----------|-------|
|         1 | test2 |
|         2 | hello |

Résultat:

SELECT [AnotherID], [text]
FROM(
SELECT *,
ROW_NUMBER()over(partition by AnotherID order by updateDate desc) as rn
FROM Table1)a
WHERE a.rn = 1


0 commentaires

0
votes

Vous semblez vouloir la version la plus récente avant la date du tableau 2. Si tel est le cas, la logique correcte serait:

SELECT t1.*
FROM Table1 t1
WHERE t1.updateDate = (SELECT MAX(tt1.versionDate)
                       FROM Table1 tt1 JOIN
                            Table2 t2
                            ON tt1.updateDate <= t2.versionDate
                       WHERE t2.ID = 1
                      ) ;


0 commentaires