Domanda

Mi piacerebbe unirsi a un tavolo subquery / derivata che contiene una clausola WITH (la clausola è necessario per filtro ROW_NUMBER() = 1). In Teradata qualcosa di simile avrebbe funzionato bene, ma usi Teradata QUALIFY ROW_NUMBER() = 1 invece di una clausola WITH.

Ecco il mio tentativo di questa registrazione:

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

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

L'aggiunta di una condizione di join è probabilmente meno efficace, ma di solito funziona bene per me.

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

Altri suggerimenti

Si potrebbe utilizzare più con clausole. Qualcosa di simile

;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 

Per maggiori dettagli sulle usanze / struttura / rules vedere CON common_table_expression (Transact -SQL)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top