我在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
请帮助我解决这个问题。谢谢
答案 0 :(得分:6)
使用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