3

私の前の質問でかなり大きなエラーがありました

複数の行から最も早い日付を選択します

horse_with_no_nameによる回答は完璧な結果を返し、私は非常に感謝していますが、私自身の最初の質問が間違っていたので、本当にお詫びします。下の表を見ると、

Circuit_uid | customer_name | Rack_location | reading_date | reading_time | アンペア| ボルト| kw | kwh | kva | pf | 鍵
-------------------------------------------------- -------------------------------------------------- ----------------------------------
cu1.cb1.r1 | 顧客1| 12.01.a1 | 2012-01-02 | 00:01:01 | 4.51 | 229.32 | 1.03 | 87 | 1.03 | 0.85 | 15
cu1.cb1.r1 | 顧客1| 12.01.a1 | 2012-01-02 | 01:01:01 | 4.18 | 230.3 | 0.96 | 90 | 0.96 | 0.84 | 16
cu1.cb1.r2 | 顧客1| 12.01.a1 | 2012-01-02 | 00:01:01 | 4.51 | 229.32 | 1.03 | 21 | 1.03 | 0.85 | 15
cu1.cb1.r2 | 顧客1| 12.01.a1 | 2012-01-02 | 01:01:01 | 4.18 | 230.3 | 0.96 | 23 | 0.96 | 0.84 | 16
cu1.cb1.s2 | 顧客2| 10.01.a1 | 2012-01-02 | 00:01:01 | 7.34 | 228.14 | 1.67 | 179 | 1.67 | 0.88 | 24009
cu1.cb1.s2 | 顧客2| 10.01.a1 | 2012-01-02 | 01:01:01 | 9.07 | 228.4 | 2.07 | 182 | 2.07 | 0.85 | 24010
cu1.cb1.s3 | 顧客2| 10.01.a1 | 2012-01-02 | 00:01:01 | 7.34 | 228.14 | 1.67 | 121 | 1.67 | 0.88 | 24009
cu1.cb1.s3 | 顧客2| 10.01.a1 | 2012-01-02 | 01:01:01 | 9.07 | 228.4 | 2.07 | 124 | 2.07 | 0.85 | 24010
cu1.cb1.r1 | 顧客3| 01.01.a1 | 2012-01-02 | 00:01:01 | 7.32 | 229.01 | 1.68 | 223 | 1.68 | 0.89 | 48003
cu1.cb1.r1 | 顧客3| 01.01.a1 | 2012-01-02 | 01:01:01 | 6.61 | 228.29 | 1.51 | 226 | 1.51 | 0.88 | 48004
cu1.cb1.r4 | 顧客3| 01.01.a1 | 2012-01-02 | 00:01:01 | 7.32 | 229.01 | 1.68 | 215 | 1.68 | 0.89 | 48003
cu1.cb1.r4 | 顧客3| 01.01.a1 | 2012-01-02 | 01:01:01 | 6.61 | 228.29 | 1.51 | 217 | 1.51 | 0.88 | 48004

ご覧のとおり、各顧客には複数の回線があります。したがって、結果は、顧客ごとの各回線の最も早いkwh読み取り値の合計になるため、この表の結果は次のようになります。

customer_name | kwh(sum)
--------------+-----------
customer 1    | 108      (the result of 87 + 21)  
customer 2    | 300      (the result of 179 + 121)  
customer 3    | 438      (the result of 223 + 215)   

顧客ごとに2つ以上の回路があり、読み取りはさまざまな時間に発生する可能性があるため、「最も早い」読み取りが必要です。

改訂された質問について誰か提案がありますか?

CentOs/Redhat上のPostgreSQL8.4。

4

2 に答える 2

2
SELECT customer_name, sum(kwh) AS kwh_total
FROM  (
    SELECT DISTINCT ON (customer_name, circuit_uid)
           customer_name, circuit_uid, kwh
    FROM   readings
    WHERE  reading_date = '2012-01-02'::date
    ORDER  BY customer_name, circuit_uid, reading_time
    ) x
GROUP  BY 1

と同じように、あたりの最も早いものを選択し(customer_name, circuit_uid)ます。
次に、あたりの合計customer_name

索引

次のような複数列のインデックスを使用すると、これが非常高速になります。

CREATE INDEX readings_multi_idx
ON readings(reading_date, customer_name, circuit_uid, reading_time);
于 2012-11-17T19:06:33.587 に答える
1

これは、元の質問の拡張です。

select customer_name,
       sum(kwh)
from (
   select customer_name,
          kwh,
          reading_time,
          reading_date,
          row_number() over (partition by customer_name, circuit_uid order by reading_time) as rn
   from readings
   where reading_date = date '2012-01-02'
) t
where rn = 1
group by customer_name

外側のクエリの新しいものと内側のクエリsum()の変更されpartition byた定義(前の質問と比較して)に注意してください。これcircuit_uidは、(各顧客の最初の読み取り値ではなく)それぞれの最初の読み取り値を計算します。

于 2012-11-17T19:05:53.570 に答える