1

MySQL 5.0 を使用しています。

ビュー内の前の行に基づいて計算を実行したいと考えています。これは可能ですか?クエリが実際に実行される前にビューが存在しないため、そうではないと想定しています。これに対する回避策はありますか、それともテーブルの作成と更新が私の最善の策ですか?

これは私の間違ったコーディングであり、ロジックが不足していることはわかっていますが、私が達成したいことを示しています。

CREATE VIEW `Master Facebook Data` tt1 AS SELECT
    t1.id AS `Client ID`, 
    t1.name AS `Client Name`,
    t1.`Date`,
    avg(t1.`Daily People Talking About This`) AS `Avg Daily Talk`,
    (((tt1.`Avg Daily Talk`-IFNULL(tt2.`Avg Daily Talk`, 0)))/tt1.`Avg Daily Talk`) AS `Change in Talk`,
    avg(t1.`Weekly Total Reach`) AS `Avg Weekly Reach`,
    (((tt1.`Avg Weekly Reach`-IFNULL(tt2.`Avg Weekly Reach`, 0)))/tt1.`Avg Weekly Reach`) AS `Change in Reach`,
    avg(t1.`Daily Viral Reach`) AS `Avg Daily Viral`,
    (((tt1.`Avg Daily Viral`-IFNULL(tt2.`Avg Daily Viral`, 0)))/tt1.`Avg Daily Viral` AS `Change in Viral`

FROM `clients` t1
JOIN `FB Exports - Key Metrics` t2
ON t1.`id` = t2.`client`

LEFT OUTER JOIN `Master Facebook Data` tt2
ON tt1.`Client ID` = tt2.`Client ID` 
AND month(tt1.`Date`)-month(tt2.`Date`)=1

GROUP BY t2.`client`, month(t2.`Date`)
ORDER BY t2.`client`, t2.`Date`

どうもありがとう!=]

4

1 に答える 1

0

ビューとテーブルはそれほど違いはありません。SQL は、通常のビューを、それを計算するためのレシピであると理解しています。そのため、テーブルの複雑な結合を結合できるように、同じビューまたは他のビューに結合できます。

いずれにせよ、前の行というものはありません。テーブルとビューは、順序付けされた一連の行ではなく、本質的に行のセットです。クエリで指定した場合ORDER BY、その順序付けを強制することは、概念的に適用される最後の操作です。

これは、問題が解決できないという意味ではありません。データモデル、データ分布に関する仮定などは指定しませんが、一般的には次のとおりです。

ビューにしましょうA。順序付けcolする、null 非許容の一意の制約付きの列にします (「前の行」の定義で使用するため)。次に、この種のクエリを見てください。

A AS a
LEFT JOIN A AS b ON b.col < a.col
LEFT JOIN A AS c ON c.col < a.col AND c.col > b.col
...
WHERE c.col IS NULL

colは null 非許容であるため、WHERE 句は事実上、「の間に何もなかったba」と言っています。また、b.colは 未満である必要があったため、これは、必要な直前の一意のレコードであるa.colことを意味します。ba

繰り返しますが、それcolNOT NULLand UNIQUE(主キーである可能性があります) であることを確認してください。そうしないと、このメソッドは見事に失敗します。

この方法は、パフォーマンスの問題が発生する可能性があるため、非常に大きなデータには適していません。その場合、新しい整数列を使用して、上記の質問のように 1 を単純に減算できるように、正しく順序付けられた連続シーケンスを割り当てる必要があります。

于 2012-06-19T20:47:58.590 に答える