2015-10-06 6 views
6

Ho un obbligo di visualizzare la stima della spesa per gli ultimi 30 giorni. SpendEstimation viene calcolato più volte al giorno. Ciò può essere ottenuto utilizzando semplici query SQL:Come eseguire SELECT DISTINCT ON query utilizzando SQLAlchemy

SELECT DISTINCT ON (date) date(time) AS date, resource_id , time 
FROM spend_estimation 
WHERE 
    resource_id = '<id>' 
    and time > now() - interval '30 days' 
ORDER BY date DESC, time DESC; 

Purtroppo non riesco a essere in grado di fare lo stesso utilizzando SQLAlchemy. Crea sempre select distinct su tutte le colonne. La query generata non contiene distinct on.

query = session.query(
    func.date(SpendEstimation.time).label('date'), 
    SpendEstimation.resource_id, 
    SpendEstimation.time 
).distinct(
    'date' 
).order_by(
    'date', 
    SpendEstimation.time 
) 
SELECT DISTINCT 
    date(time) AS date, 
    resource_id, 
    time 
FROM spend 
ORDER BY date, time 

Manca ON (date) bit. Se utente query.group_by - SQLAlchemy aggiunge distinct on. Anche se non riesco a pensare a una soluzione per un dato problema usando group by.


Provato a utilizzare la funzione in una parte distinta e ordinare per parte pure.

query = session.query(
    func.date(SpendEstimation.time).label('date'), 
    SpendEstimation.resource_id, 
    SpendEstimation.time 
).distinct(
    func.date(SpendEstimation.time).label('date') 
).order_by(
    func.date(SpendEstimation.time).label('date'), 
    SpendEstimation.time 
) 

che ha portato in questo SQL:

SELECT DISTINCT 
     date(time) AS date, 
     resource_id, 
     time, 
     date(time) AS date # only difference 
FROM spend 
ORDER BY date, time 

che ancora manca DISTINCT ON.

+0

che dbms stai usando? AFAIK SQLAlchemy supporta DISTINCT ON solo su dialetti specifici – architectonic

+0

Re: @architectonic - http://stackoverflow.com/questions/17223174/returning-distinct-rows-in-sqlalchemy-with-sqlite - vedere la prima risposta – Monkpit

+0

Re @architectonic questo è molto buona domanda - sto usando il database postgresql. – aisbaa

risposta

0

Domanda stupida: hai provato a distinguere su SpendEstimation.date anziché su 'date'?

EDIT: Mi ha colpito il fatto che tu stia cercando di utilizzare la colonna con nome dallo SELECT. SQLAlchemy non è così intelligente. Prova a immettere l'espressione func nella chiamata distinct().

+0

Ciao, grazie per il suggerimento, la colonna 'SpendEstimation.date' non esiste, è calcolata da spendere_tempo. Forse è possibile aggiungere "virtual_column" al modello, non è sicuro. Ho provato a passare 'func' a distinto e non ha modificato la query in modo atteso. – aisbaa

+0

OK. Un'altra domanda stupida: quale versione di SQLAlchemy stai usando? – alyssackwan

+0

Inoltre, qual è il codice Python aggiornato usando l'approccio 'func'? Hai provato a inserire "data" in un 'text()'? – alyssackwan