回答編集履歴

6

追記

2021/03/22 08:25

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -65,3 +65,51 @@
65
65
  ```
66
66
 
67
67
  ※手元には8.0の環境はありませんので、確認は出来ておらず、エラーになるかもしれません。
68
+
69
+
70
+
71
+ 他のセッションの影響を受けないように一時テーブルをパラメータに利用するようにすると、SQLを動的に変更する必要は無くなります。
72
+
73
+ ```SQL
74
+
75
+ CREATE TEMPORARY TABLE para (
76
+
77
+ 指定名前 text
78
+
79
+ , 指定日付 date
80
+
81
+ ) ON COMMIT DELETE ROWS
82
+
83
+ ;
84
+
85
+ ```
86
+
87
+ ```SQL
88
+
89
+ insert into para values
90
+
91
+ ('田中', '2021-03-15')
92
+
93
+ ,('鈴木', '2021-03-14')
94
+
95
+ ;
96
+
97
+ SELECT *
98
+
99
+ FROM テーブル
100
+
101
+ where (名前, 日付) in (
102
+
103
+ select 名前, MAX(日付)
104
+
105
+ FROM テーブル t inner join para p
106
+
107
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
108
+
109
+ group by 名前
110
+
111
+ )
112
+
113
+ ;
114
+
115
+ ```

5

追記

2021/03/22 08:25

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -29,3 +29,39 @@
29
29
  ```
30
30
 
31
31
  ※性能を求めるなら(名前,日付)のインデックスが必要です。
32
+
33
+ 追記
34
+
35
+ --
36
+
37
+ Postgresのバージョンが8.0との事なので、パラメータの指定が分かりにくくなりますが、unnest()を使用した例です。
38
+
39
+ ```SQL
40
+
41
+ SELECT *
42
+
43
+ FROM テーブル
44
+
45
+ where (名前, 日付) in (
46
+
47
+ select 名前, MAX(日付)
48
+
49
+ FROM テーブル t inner join (
50
+
51
+ select
52
+
53
+ unnest(array['田中','鈴木']::text[]) as 指定名前
54
+
55
+ , unnest(array['2021-03-15', '2021-03-14']::date[]) as 指定日付
56
+
57
+ ) p
58
+
59
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
60
+
61
+ group by 名前
62
+
63
+ )
64
+
65
+ ```
66
+
67
+ ※手元には8.0の環境はありませんので、確認は出来ておらず、エラーになるかもしれません。

4

推敲

2021/03/22 08:13

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  where (名前, 日付) in (
8
8
 
9
- select t.名前, MAX(日付)
9
+ select 名前, MAX(日付)
10
10
 
11
11
  FROM テーブル t inner join (
12
12
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  on t.名前=p.指定名前 and t.日付<=p.指定日付
24
24
 
25
- group by t.名前
25
+ group by 名前
26
26
 
27
27
  )
28
28
 

3

推敲

2021/03/22 05:31

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -16,11 +16,11 @@
16
16
 
17
17
  ,('鈴木', '2021-03-14' ::date)
18
18
 
19
- ) as w(名前,指定日付)
19
+ ) as w(指定名前,指定日付)
20
20
 
21
21
  ) p
22
22
 
23
- on t.名前=p.名前 and t.日付<=p.指定日付
23
+ on t.名前=p.指定名前 and t.日付<=p.指定日付
24
24
 
25
25
  group by t.名前
26
26
 

2

推敲

2021/03/22 05:30

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -16,11 +16,11 @@
16
16
 
17
17
  ,('鈴木', '2021-03-14' ::date)
18
18
 
19
- ) as w(名前,基準日付)
19
+ ) as w(名前,指定日付)
20
20
 
21
21
  ) p
22
22
 
23
- on t.名前=p.名前 and t.日付<=p.基準日付
23
+ on t.名前=p.名前 and t.日付<=p.指定日付
24
24
 
25
25
  group by t.名前
26
26
 

1

追記

2021/03/22 05:24

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -27,3 +27,5 @@
27
27
  )
28
28
 
29
29
  ```
30
+
31
+ ※性能を求めるなら(名前,日付)のインデックスが必要です。