在范围内分组和排序的多个不同值

时间:2018-01-18 20:31:16

标签: sql postgresql

尝试弄清楚如何在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  

2 个答案:

答案 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