私は SQL の初心者で、現在の行と前の行の間の列の DateDiff を計算する計算列をテーブルに作成しようとしています。
これですべてがうまくいき、Select を使用してクエリを実行してこの値を表示できるようになりました。
SELECT *,
Case When INCM<> lag(INCM) over(ORDER BY INCM ASC, Submit_Date ASC) Then 0 else DateDiff(mi,Submit_Date, lag(Submit_Date) over (ORDER BY INCM ASC, Submit_Date ASC)) End As Diff
FROM [OP].[Ticket_Work_Info]
しかし、最近気づいたのですが、このロジックを含む計算列を既存のテーブルに追加すると、ウィンドウ関数は Select または Order By でのみ使用できるというエラーが表示されます。
テーブル上に計算列を作成するために使用できる LAG と同等のものをどこでも探してきました。
それまでのところ、このコード部分でビューを作成することになりましたが、それは今後実際にやりたいことではありません。
誰か手伝ってくれませんか?
よろしくお願いします。
2
これはユーザー定義関数を使用してのみ実行できます。より良い代替方法は、ビューを使用することです。
– ゴードン・リノフ
2020 年 9 月 3 日 15:56
1
計算列には他に考慮すべき行がないため、ウィンドウ関数、集計関数、または分析関数を許可することは意味がありません。 LAG() はどの結果セットに適用されますか?
– パナギオティス・カナボス
2020 年 9 月 3 日 15:59
わかりました。ビューを続行します。
– エントロピー
2020 年 9 月 4 日 9:47
------------------------
ここでは、計算列が現在の行の値 (および決定論的な関数と定数) のみを参照できる理由について、いくつかの理由を説明します。次のような定義を検討してください。
create t (
t_id int,
a varchar(255),
x int,
prev_x as (lag(x) over (order by t_id)
);
サンプル データ:
id y x
1 z 6
2 abc 28
3 z 496
これは問題ないようです。ただし、次のクエリを考えてみましょう。
select t.*
from t
where a <> 'abc';
3 行目の x_prev の値は 28 または 6 にする必要がありますか?
これについては誰も決断を下したくなかったのでしょう。代わりに、行は明確に定義されているため、フィルタリング条件は行内の値に影響を与えないという考え方です。
1
ありがとうございます。ビューを使用します
– エントロピー
2020 年 9 月 4 日 9:47