尝试弄清楚如何在Postgresql上编写查询以完成选择多个不同范围和最小值。
此查询不起作用:
SELECT distinct (a.userID),
a.id,
a.serverID,
min(a.minTime),
a.recTime
from test_table as a where
a.id >= 1
group by a.serverID,
a.userID,
a.id,
a.recTime
order by
a.serverID desc;
(这是一个SQL Fiddle创建包含数据的表和上面的查询)
为了说明这个问题,我有一个包含如下数据的示例表:
id userID serverID minTime recTime
-----------------------------------------------------
1 foo 120 9.8 1/18/18 12:26
2 foo 120 4.4 1/19/18 12:26
3 foo 119 2.3 1/20/18 12:26
4 bar 118 12.7 1/21/18 12:26
5 bar 120 6.6 1/22/18 12:26
6 foo 118 4.9 1/23/18 12:26
7 bar 119 17.5 1/18/18 12:26
8 tab 118 12.1 1/18/18 12:25
9 tab 119 3.2 1/19/18 12:25
10 foo 120 11.4 1/20/18 12:25
11 foo 120 5.2 1/21/18 12:25
12 bar 120 8.9 1/22/18 12:25
13 foo 118 4.1 1/23/18 12:25
14 tab 119 12.3 1/24/18 12:25
15 tab 120 9.6 1/25/18 12:25
16 bar 119 4.8 1/26/18 12:25
17 tab 118 11.0 1/27/18 12:25
我想要完成的是在一系列记录ID中选择所有不同的userID配对到serverID(在本例中为1..17)。在该组中,我需要返回包含每个paring的服务器ID的最小minTime的不同记录。用户ID& serverID经常更改,因此无法将其硬编码到查询中。
查询的期望结果(基于此示例数据)应如下所示(添加空格或可读性):
id userID serverID minTime recTime
-----------------------------------------------------
2 foo 120 4.4 1/19/18 12:26
3 foo 119 2.3 1/20/18 12:26
13 foo 118 4.1 1/23/18 12:25
5 bar 120 6.6 1/22/18 12:26
16 bar 119 4.8 1/26/18 12:25
4 bar 118 12.7 1/21/18 12:26
15 tab 120 9.6 1/25/18 12:25
9 tab 119 3.2 1/19/18 12:25
17 tab 118 11 1/27/18 12:25
答案 0 :(得分:0)
<强> SQL DEMO 强>
.container
<强>输出强>
WITH ranking as (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY userID, serverID
ORDER BY minTime) as rn
FROM YourTable
WHERE id BETWEEN 1 AND 17
)
SELECT *
FROM ranking
WHERE rn = 1
答案 1 :(得分:0)
使用派生表和min
select tt.* from
(
select
t.UserID,
T.ServerID,
min(minTime) NewMinTime
from
test_table t
group by
t.userId,ServerID
) x
inner join test_table tt
on tt.userid = x.userid
and tt.serverid = x.serverid
and tt.mintime = x.newmintime
order by tt.userid,tt.id