2017-09-06 8 views
0

私は特定の日付の後に日ごとに計算されたインデックスのリストを取得するには、次のスクリプトを持っている:問題は、私はジャンゴで同じを取得したいということですDjangoを使用して複雑なSQLクエリを実行することはできますか?

--------------------------- 
| date_request | index_hb | 
--------------------------- 
| 20170904 | 7.5508 | 
| 20170905 | 7.6870 | 
| 20170825 | 7.4335 | 
| 20170901 | 7.7116 | 
| 20170824 | 1.6568 | 
| 20170823 | 0.0000 | 
| 20170903 | 5.1850 | 
| 20170830 | 0.0000 | 
| 20170828 | 0.0000 | 
--------------------------- 

と:

with test_reqs as (
select id_test, date_request, sum(n_requests) as n_req from cdr_test_stats 
where 
id_test in (2,4) and -- List of Ids included in index calc 
date_request >= 20170823 -- Start date (end date -> Last in DB -> Today) 
group by id_test, date_request 
), 
date_reqs as (
select date_request, sum(n_req) as n_req 
from test_reqs 
group by date_request 
), 
test_reqs_ratio as (
select H.id_test, H.date_request, 
case when D.n_req = 0 then null else H.n_req/D.n_req end as ratio_req 
from test_reqs H 
inner join date_reqs D 
on H.date_request = D.date_request 
), 
test_reqs_index as (
select HR.*, least(nullif(HA.n_dates_hbalert, 0), 10) as index_hb 
from test_reqs_ratio HR 
left join cdr_test_alerts_stats HA 
on HR.id_test = HA.id_test and HR.date_request = HA.date_request 
) 
select date_request, 10-sum(ratio_req*index_hb) as index_hb 
from test_reqs_index 
group by date_request 

の検索結果をカーソルを使用して生のクエリを実行しないようにします。

ご意見ありがとうございました。

+1

モデルを表示して質問する内容を説明すると、答えが簡単になります。 –

答えて

0

Django ORMには、ほとんどの問題を処理するのに十分な表現力があると言えますが、一般的には、最初からクエリを再設計する必要があります。 CTEの代わりにサブクエリと結合を使用する必要があり、DBの代わりにPythonの土地でいくつかの作業を行うソリューションになる可能性があります。

これを考慮に入れて、答えは次のとおりです。パフォーマンスやデータサイズなどの機能要件が重要です。

SQLクエリをビューとして宣言し、少なくともPostgresの場合は、のようなものをDjango ORMでほぼモデルのように使用します。

関連する問題