2017-12-07 6 views
0

テーブルwifi_user_analytic_dyに挿入する必要があるSELECTクエリがあります。クエリに基づいてサブクエリを使用した更新

SELECT 
    date(acctstarttime) 
, round(avg(acctsessiontime),2)average_connected_ap 
, calledstationid 
FROM (SELECT acctstarttime, acctsessiontime, calledstationid 
    FROM wifi_radacct 
    WHERE acctstoptime <> '' 
    and date(acctstarttime)= date_trunc('day', now()) -'1 day'::interval 
)a 
group by calledstationid, date(acctstarttime) 

サンプル結果:

| date  | average_connected_ap | calledstationid | 
| 2017-12-06 | 1000     | publica   | 
| 2017-12-06 | 800     | tumis   | 
| 2017-12-06 | 500     | penyet   | 

上記のクエリは、日付とAPの平均接続ベースを検索し、テーブルwifi_user_analytic_dyに更新しようとしています。以下は、テーブルwifi_user_analytic_dy内の予想される結果です。

| date  | ap  | average_connected_duration_ap | 
| 2017-12-06 | publica |  1000      | 
| 2017-12-06 | tumis |  800      | 
| 2017-12-06 | penyet |  500      | 

私は上記のSELECTクエリからコピーaverage_connected_apデータをしようと列average_connected_duration_apでテーブルwifi_user_analytic_dyを更新しています。以下のUPDATEクエリは正しい結果を生成しません。同じ値をすべてのapにコピーしています。

この更新クエリを修正する方法を教えてください。

UPDATE wifi_user_analytic_dy B 
SET avg_connected_duration_ap = (select round(avg(wifi_radacct.acctsessiontime),2) 
     from wifi_radacct 
     where date(acctstarttime)= date_trunc('day', now()) -'1 day'::interval 
     ) 
FROM wifi_radacct A 
WHERE A.calledstationid=B.ap and A.date(acctstarttime)= B.date 
; 

誰かが私に助言してくれることを願っています。

+1

データとテーブル構造を指定すると、SQLの質問に答えるのが簡単です。たぶんあなたは[sqlfiddle](http://www.sqlfiddle.com/)を提供することができますか? –

+0

データサンプルと期待される結果をご記入ください –

答えて

0

CTEを使用できます。以下のようなもの:

WITH C as 
(select 
    D.ap, D.bate, 
    (select round(avg(wifi_radacct.acctsessiontime),2) 
    from wifi_radacct 
    where date(acctstarttime)= date_trunc('day', now()) -'1 day'::interval) as V 
    FROM wifi_radacct A 
    JOIN wifi_user_analytic_dy D 
    ON A.calledstationid=D.ap and A.date(acctstarttime)= D.date 
) 
UPDATE wifi_user_analytic_dy B 
SET avg_connected_duration_ap = V 
FROM C where A.calledstationid=C.ap and A.date(acctstarttime)=C.date 

が、その後、あなたがいずれかのサブクエリを必要としない:

WITH C as 
(select 
    D.ap, D.bate, 
    round(avg(A.acctsessiontime),2 
    from wifi_radacct 
    where date(acctstarttime)= date_trunc('day', now()) -'1 day'::interval) as V 
    FROM wifi_radacct A 
    JOIN wifi_user_analytic_dy D 
    ON A.calledstationid=D.ap and A.date(acctstarttime)= D.date 
    GROUP BY D.ap,D.date 
) 
UPDATE wifi_user_analytic_dy B 
SET avg_connected_duration_ap = V 
FROM C where A.calledstationid=C.ap and A.date(acctstarttime)=C.date 

、おそらく参加する必要はありません。

+0

最初のクエリにはエラースキーマ「a」がありません。 2番目にもエラーがありました。クエリを再修正してテストする時間を与えてください。 – Samila

関連する問題