2016-07-05 15 views
5

Ho una query che devo eseguire per restituire la riga aggiornata più di recente per ciascun client.ROW_COUNT Equivalente per la cache di Intersystems?

In SQL Server, vorrei fare quanto segue:

SELECT * 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY date_updated DESC) AS rn 
    FROM client_address 
) a 
WHERE a.rn = 1 

C'è un modo simile a fare questo su Intersystems cache? Non sto trovando alcuna documentazione per alcun tipo di funzione di classifica.

risposta

3

Vedi the documentation for HAVING. Ecco come utilizzarlo in questo caso:

SELECT * 
FROM client_address 
GROUP BY client_id 
HAVING date_updated = MIN(date_updated) 
+1

"SELECT * FROM t GROUP BY ID" funziona? Cosa fa per i campi non specificati nel gruppo? –

+0

C'è una discussione sulla query sulla comunità degli sviluppatori di InterSystems https://community.intersystems.com/post/top-group-sql-query-cach%C3%A9 –

4

Ho guardato su the docs e non sembra che ci sia nessuna delle funzioni di Windows esistenti in SQL Server, Oracle o Postgres quindi sei bloccato con la soluzione ANTI-THETA-SELF-JOIN.

SELECT * 
FROM 
    client_address a 
    LEFT JOIN client_address b 
    on a.client_id = b.client_id 
    and a.date_updated < b.date_updated 
WHERE 
    b.client_id is null 
+0

Non so perché questo è stato downvoted. È sbagliato in qualche modo? per esempio. questa espressione non è supportata nella cache? Non fa quello che l'op voleva? –

+0

Non so perché sia ​​stato downvoted. Fa il lavoro. –

+0

Sto indovinando solo osservando la query che se ci sono> 1 righe con lo stesso timestamp, che le restituirà tutte. Ho ragione? –

0

È possibile utilizzare %vid variabile. Ad esempio:

SELECT *, %vid FROM (SELECT * FROM Sample.Person) WHERE %vid BETWEEN 5 AND 10

ritornerebbe righe 5-10 dalla tabella Sample.Person.

Documentation.

Discussion on InterSystems Caché developer community.

+0

Puoi dare qualche spiegazione in più su come risolvere il mio problema? Ho eseguito questo e ho ottenuto solo cinque righe, con il set di dati che include più di una riga per lo stesso client, che non è il comportamento che stavo cercando. –

+0

Questo è un problema 1 superiore per gruppo, non un problema di paging –

0

prima del voto verso il basso !!!! Sto solo chiedendo se questo funzionerebbe. È più un apprendimento da parte mia basato su come l'ho fatto in passato. Posso non capire la domanda e preferirei eliminare o discutere di ricevere un voto verso il basso :)

SELECT * 
FROM client_address a 
WHERE 
a.date_updated = 
(
SELECT max(b.date_updated) FROM client_address b 
group by b.Client_id 
) 
+0

Non penso che funzionerà. Non c'è nulla che unisce la sottoquery alla query principale oltre alla data massima. Forse funzionerebbe come join interno se invece includi il client id nella sottoquery e ti unisci sia su client_id che su max_date. –

+0

@AlexBello yeah 'SELECT * FROM client_address a INNER JOIN (SELECT b.Client_id, max (b.date_updated) max_updated FROM client_address b group di b.Client_id) c ON a.Client_id = c.Client_id AND a.date_updated = c .date_updated' dovrebbe funzionare pure. –

+0

Non sono sicuro di capire perché non funzionerebbe, ma proverò con la soluzione Conrads sulle query simili che sto usando e vedrò se ottengo gli stessi risultati o forse migliori prestazioni. Grazie! – CoSpringsGuy

Problemi correlati