teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2020/11/29 14:41

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -13,4 +13,19 @@
13
13
  ```
14
14
  ※1年前の算出は単に単に年から-1しているだけですので、閏年などは考慮していません。
15
15
  (1日分の誤差が生じる)
16
- 閏年の考慮が必要なら、日付型に変更して演算して下さい。
16
+ 閏年の考慮が必要なら、日付型に変更して演算して下さい。
17
+
18
+ 追記
19
+ --
20
+ 質問に追記された内容を相関サブクエリーに変更してみました。
21
+ ```SQL
22
+ SELECT A.ID
23
+ , A.EVENT_DATE
24
+ , (select COUNT(ID) from tbl
25
+ where ID = A.ID
26
+ AND EVENT_DATE < A.EVENT_DATE
27
+ AND EVENT_DATE > ADD_MONTHS(A.EVENT_DATE, -12)
28
+ ) AS FREQ_PAST_1YEAR
29
+ FROM Tbl A
30
+ ;
31
+ ```

3

推敲

2020/11/29 14:41

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -11,4 +11,6 @@
11
11
  from tbl t1
12
12
  order by ID, event_date
13
13
  ```
14
- ※閏年などは考慮していません。
14
+ 1年前の算出は単に単に年から-1しているだけですので、閏年などは考慮していません。
15
+ (1日分の誤差が生じる)
16
+ 閏年の考慮が必要なら、日付型に変更して演算して下さい。

2

推敲

2020/11/29 14:34

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -10,4 +10,5 @@
10
10
  ) as freq_past_1year
11
11
  from tbl t1
12
12
  order by ID, event_date
13
- ```
13
+ ```
14
+ ※閏年などは考慮していません。

1

訂正

2020/11/29 09:02

投稿

sazi
sazi

スコア25430

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