Question

Je voudrais rejoindre un sous-requête / table dérivée qui contient une clause WITH (la clause WITH est nécessaire de filtrer sur ROW_NUMBER() = 1). Dans Teradata quelque chose de similaire fonctionnerait très bien, mais Teradata usages QUALIFY ROW_NUMBER() = 1 au lieu d'une clause WITH.

Voici ma tentative de cette jointure:

-- want to join row with max StartDate on JobModelID
INNER JOIN (
    WITH AllRuns AS (
        SELECT *,
            ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber
        FROM Runs
    )
    SELECT * FROM AllRuns WHERE RowNumber = 1
) Runs
ON JobModels.JobModelID = Runs.JobModelID

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Ajout d'une condition de jointure est probablement moins efficace, mais fonctionne généralement bien pour moi.

INNER JOIN (
    SELECT *,
           ROW_NUMBER() OVER 
           (PARTITION BY JobModelID 
           ORDER BY StartDate DESC) AS RowNumber
      FROM Runs
    ) Runs
ON JobModels.JobModelID = Runs.JobModelID 
AND Runs.RowNumber = 1

Autres conseils

Vous pouvez utiliser plusieurs clauses WITH. Quelque chose comme

;WITH AllRuns AS ( 
        SELECT  *, 
                ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber 
        FROM    Runs 
),
Runs AS(
        SELECT  * 
        FROM    AllRuns 
        WHERE   RowNumber = 1
)

SELECT  *
FROM    ... INNER JOIN ( 
        Runs ON JobModels.JobModelID = Runs.JobModelID 

Pour plus de détails sur les usages / structure / règles voir AVEC common_table_expression (Transact -SQL)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top