回答編集履歴

4

追記

2020/11/29 14:41

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -29,3 +29,33 @@
29
29
  (1日分の誤差が生じる)
30
30
 
31
31
  閏年の考慮が必要なら、日付型に変更して演算して下さい。
32
+
33
+
34
+
35
+ 追記
36
+
37
+ --
38
+
39
+ 質問に追記された内容を相関サブクエリーに変更してみました。
40
+
41
+ ```SQL
42
+
43
+ SELECT A.ID
44
+
45
+ , A.EVENT_DATE
46
+
47
+ , (select COUNT(ID) from tbl
48
+
49
+ where ID = A.ID
50
+
51
+ AND EVENT_DATE < A.EVENT_DATE
52
+
53
+ AND EVENT_DATE > ADD_MONTHS(A.EVENT_DATE, -12)
54
+
55
+ ) AS FREQ_PAST_1YEAR
56
+
57
+ FROM Tbl A
58
+
59
+ ;
60
+
61
+ ```

3

推敲

2020/11/29 14:41

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -24,4 +24,8 @@
24
24
 
25
25
  ```
26
26
 
27
- ※閏年などは考慮していません。
27
+ 1年前の算出は単に単に年から-1しているだけですので、閏年などは考慮していません。
28
+
29
+ (1日分の誤差が生じる)
30
+
31
+ 閏年の考慮が必要なら、日付型に変更して演算して下さい。

2

推敲

2020/11/29 14:34

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -23,3 +23,5 @@
23
23
  order by ID, event_date
24
24
 
25
25
  ```
26
+
27
+ ※閏年などは考慮していません。

1

訂正

2020/11/29 09:02

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -1,57 +1,25 @@
1
- > 「各IDごとに過去1年間に起きイベント回数をイベントの日付ごとに求める」
1
+ 質問の意図を読み違えていので訂正しました。
2
2
 
3
-
4
-
5
- という事ですが、質問のfreq_past_1yearの例ではその通りになっていません。
6
-
7
-
8
-
9
- 取り敢えずは件数の累計を求めるという事なので、window関数を使用します。
10
-
11
-
12
-
13
- ※event_dateは数値型とし扱っています。
3
+ 相関サブクエリーを用いています。
14
-
15
-
16
-
17
- 年だとすると以下です。
18
4
 
19
5
  ```SQL
20
6
 
21
7
  select *
22
8
 
23
- , count(*) over(partition by ID, event_date/10000 order by event_date) -1 as freq_past_1year
9
+ , (
24
10
 
11
+ select count(*) from tbl
12
+
13
+ where id = t1.id
14
+
15
+ and event_date >= t1.event_date -10000
16
+
17
+ and event_date < t1.event_date
18
+
19
+ ) as freq_past_1year
20
+
25
- from tbl
21
+ from tbl t1
26
22
 
27
23
  order by ID, event_date
28
24
 
29
25
  ```
30
-
31
-
32
-
33
- 年度(4月から3月)という事なら、-3か月して年度に変換します。
34
-
35
- ```SQL
36
-
37
- select *
38
-
39
- , count(*)
40
-
41
- over(
42
-
43
- partition by
44
-
45
- ID
46
-
47
- , year(dateadd(month, -3,cast(format(event_date, '0000/00/00') as date)))
48
-
49
- order by event_date
50
-
51
- ) -1 as freq_past_1year
52
-
53
- from tbl
54
-
55
- order by ID, event_date
56
-
57
- ```