SQL查询以查找与每种类型的最大计数相对应的条目

时间:2018-12-07 14:54:13

标签: sql postgresql

我在Postgres中有一个表X,其中包含以下条目

A     B     C
2     3     1
3     3     1
0     4     1
1     4     1
2     4     1
3     4     1
0     5     1
1     5     1
2     5     1
3     5     1
0     2     2
1     2     3

我想找出每种A和B都具有最大列C的条目,即(按B分组),并可能进行最有效的查询,并返回对应的A和B。

预期输出:

A     B      C
1     2      3
2     3      1
0     4      1    
0     5      1 

请帮助我解决这个问题。谢谢

4 个答案:

答案 0 :(得分:6)

demo: db<>fiddle

使用DISTINCT ON

SELECT DISTINCT ON (B)
    A, B, C
FROM
    my_table
ORDER BY B, C DESC, A 

DISTINCT ON恰好为您提供了有序组的第一行。在这种情况下,B被分组了。

订购B(必要)之后:我们首先将最大的C(含DESC)订购到每个组的顶部。然后(如果有绑定的MAX(C)值),我们对A进行排序以使最小的A到达顶部。

答案 1 :(得分:2)

似乎这是每个组中最大的n个问题:

fold

您不清楚需要考虑哪个fold,上面返回的是最小try import xlrd def XLSDictReader(f, sheet_index=0): data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) book = xlrd.open_workbook(file_contents=data) sheet = book.sheet_by_index(sheet_index) def item(i, j): return (sheet.cell_value(0,j), sheet.cell_value(i,j)) return ( dict(item(i,j) for j in range(sheet.ncols)) \ for i in range(1, sheet.nrows) ) except ImportError: XLSDictReader = None 的行。

答案 2 :(得分:0)

这将起作用:

   select * from (SELECT t.*,
   rank() OVER (PARTITION BY A,B order by C) rank 
   FROM tablename t)
   where rank=1 ;

答案 3 :(得分:0)

在我看来您需要max()

select A,B, max(c) from table_name
group by A,B