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

回答編集履歴

6

追記

2021/03/22 08:25

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -31,4 +31,28 @@
31
31
  group by 名前
32
32
  )
33
33
  ```
34
- ※手元には8.0の環境はありませんので、確認は出来ておらず、エラーになるかもしれません。
34
+ ※手元には8.0の環境はありませんので、確認は出来ておらず、エラーになるかもしれません。
35
+
36
+ 他のセッションの影響を受けないように一時テーブルをパラメータに利用するようにすると、SQLを動的に変更する必要は無くなります。
37
+ ```SQL
38
+ CREATE TEMPORARY TABLE para (
39
+ 指定名前 text
40
+ , 指定日付 date
41
+ ) ON COMMIT DELETE ROWS
42
+ ;
43
+ ```
44
+ ```SQL
45
+ insert into para values
46
+ ('田中', '2021-03-15')
47
+ ,('鈴木', '2021-03-14')
48
+ ;
49
+ SELECT *
50
+ FROM テーブル
51
+ where (名前, 日付) in (
52
+ select 名前, MAX(日付)
53
+ FROM テーブル t inner join para p
54
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
55
+ group by 名前
56
+ )
57
+ ;
58
+ ```

5

追記

2021/03/22 08:25

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -13,4 +13,22 @@
13
13
  group by 名前
14
14
  )
15
15
  ```
16
- ※性能を求めるなら(名前,日付)のインデックスが必要です。
16
+ ※性能を求めるなら(名前,日付)のインデックスが必要です。
17
+ 追記
18
+ --
19
+ Postgresのバージョンが8.0との事なので、パラメータの指定が分かりにくくなりますが、unnest()を使用した例です。
20
+ ```SQL
21
+ SELECT *
22
+ FROM テーブル
23
+ where (名前, 日付) in (
24
+ select 名前, MAX(日付)
25
+ FROM テーブル t inner join (
26
+ select
27
+ unnest(array['田中','鈴木']::text[]) as 指定名前
28
+ , unnest(array['2021-03-15', '2021-03-14']::date[]) as 指定日付
29
+ ) p
30
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
31
+ group by 名前
32
+ )
33
+ ```
34
+ ※手元には8.0の環境はありませんので、確認は出来ておらず、エラーになるかもしれません。

4

推敲

2021/03/22 08:13

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  SELECT *
3
3
  FROM テーブル
4
4
  where (名前, 日付) in (
5
- select t.名前, MAX(日付)
5
+ select 名前, MAX(日付)
6
6
  FROM テーブル t inner join (
7
7
  select * from (values
8
8
  ('田中', '2021-03-15' ::date)
@@ -10,7 +10,7 @@
10
10
  ) as w(指定名前,指定日付)
11
11
  ) p
12
12
  on t.名前=p.指定名前 and t.日付<=p.指定日付
13
- group by t.名前
13
+ group by 名前
14
14
  )
15
15
  ```
16
16
  ※性能を求めるなら(名前,日付)のインデックスが必要です。

3

推敲

2021/03/22 05:31

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -7,9 +7,9 @@
7
7
  select * from (values
8
8
  ('田中', '2021-03-15' ::date)
9
9
  ,('鈴木', '2021-03-14' ::date)
10
- ) as w(名前,指定日付)
10
+ ) as w(指定名前,指定日付)
11
11
  ) p
12
- on t.名前=p.名前 and t.日付<=p.指定日付
12
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
13
13
  group by t.名前
14
14
  )
15
15
  ```

2

推敲

2021/03/22 05:30

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -7,9 +7,9 @@
7
7
  select * from (values
8
8
  ('田中', '2021-03-15' ::date)
9
9
  ,('鈴木', '2021-03-14' ::date)
10
- ) as w(名前,基準日付)
10
+ ) as w(名前,指定日付)
11
11
  ) p
12
- on t.名前=p.名前 and t.日付<=p.基準日付
12
+ on t.名前=p.名前 and t.日付<=p.指定日付
13
13
  group by t.名前
14
14
  )
15
15
  ```

1

追記

2021/03/22 05:24

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -12,4 +12,5 @@
12
12
  on t.名前=p.名前 and t.日付<=p.基準日付
13
13
  group by t.名前
14
14
  )
15
- ```
15
+ ```
16
+ ※性能を求めるなら(名前,日付)のインデックスが必要です。