0

毎月の現在の値に基づいてメーターベースの消費量を計算するのに助けが必要です

次のテーブルがあります。

Address(PostCode int, Street varchar)
Meter(MeterID int, InstallationDate date, PostCode int)
Reading(ReadNo int, ReadDate date, ReadValue int, MeterID int, ReaderID int)

私は次のことを試しました:

Select ReadDate, 
       ReadValue AS CurrentValue, 
       lag(readvalue, 1, 0) OVER (ORDER BY READVALUE) AS PreviousValue, 
       readvalue - lag(readvalue, 1, 0) OVER (ORDER BY READVALUE) AS Consumption
 From Reading R, 
      Meter M, 
      Address A 
Where R.MeterID = M.MeterID
  AND A.PostCode = M.PostCode AND A.PostCode = '1005'
Order By ReadDate;

住所のメーターを新しいメーターに交換する際に問題が発生します。誰か助けてもらえますか?

4

2 に答える 2

1

たくさんの人に感謝されると思います!

ORDER BY READVALUELAG で使用することにより、最後に取得した値ではなく、次に高い値(デフォルトのソート順は昇順) を計算します。これは

lag(readvalue, 1, 0) over (order by readdate desc)

以前に読み取った値を取得します。

メーターが同じ住所にあるかどうかを判断するには、住所テーブルに十分な情報がありません。建物番号などはありません。したがって、問題に対する正解は社会的であり、データベースとは関係ありません。誰かが 2 つのメーターを持っている場合、2 つの請求書を送ります。

ただし、住所を一意に識別できるように住所テーブルに十分な情報があると仮定すると、つまり、各郵便番号が単一の建物である場合、クエリを次のように再編成しますが、すでに正しいことを行っています (整数の引用をやめてください)。

select r.readdate
     , r.readvalue - lag(r.readvalue, 1, 0) over ( order by readdate desc )
  from address a
  join meter m 
    on a.postcode = m.postcode
  join reading r
    on m.meterid = r.meterid
 where a.postcode = 1005
 order by readdate desc

郵便番号ですべてのメーターを選択し、次にそれらすべてのメーターのすべての読み取り値を選択しています。測定値の間に新しいメーターが設置されていれば問題ありません。

これがうまくいくとは思えません。前のメーターの最終的な読み取り値があるはずです。そうしないreadvalueと、その値のラグよりも高くなり、2 つの請求書のシナリオに戻ります。または、請求書がデータベースで「最終」だった時期を示す方法が必要です。

最新の値を取得するには、これをすべてサブ選択でラップし、一番上の行を選択します。

select * from ( <above query> ) where rownum < 2
于 2012-11-11T17:37:14.087 に答える
0

あなたのスキーマはメーター (サービス) を施設に関連付けていませんか? 商用の顧客情報システムを使用している場合、それらはすべてそれを行い、請求書を作成するために使用する必要があります. サービスの表があり、その各サービスは敷地内にあります。郵送先住所は施設と同じ場合と異なる場合があります。郵送先住所は顧客に関連付けられています。たとえば、レストラン チェーンには 1 つのメイン オフィスと 20 のレストランがあります。彼らは本社で請求書を受け取るので、郵送先住所はすべて同じで、サービスの 20 の物理的な住所はおそらく非常に異なっています。

このために独自のスキーマを作成した場合は、公共料金の請求が実際にどのように機能するかを考える必要があります。これが単なるおもちゃのモデルであっても。

私は過去 30 年間、多くのシステムでこれを行ってきました。それらはすべて上記のように機能します。

于 2012-11-11T18:24:12.263 に答える