如何获取聚合函数选择的行的id? [复制]

2024-01-17

我有下一个数据:

id | name | amount | datefrom
---------------------------
3  | a    |  8     | 2018-01-01
4  | a    |  3     | 2018-01-15 10:00
5  | b    |  1     | 2018-02-20

我可以将结果与下一个查询分组:

select name, max(amount) from table group by name

但我需要id也是所选行的。因此我尝试过:

select max(id), name, max(amount) from table group by name

正如预期的那样,它返回:

id | name | amount
-----------
4  | a    |  8
5  | b    |  1

但我需要 id3的金额8:

id | name | amount
-----------
3  | a    |  8
5  | b    |  1

这可能吗?

附言。这是计费任务所必需的。有一天2018-01-15配置的a已更改,用户消耗了一些资源 10 小时,数量为8当天休息 14 小时——3。我需要用最大值来计算这样的一天。因此排与id = 42018-01-15 天被忽略。 (第二天 2018-01-16 我将计费金额3)
所以我认为对行进行计费:

3  | a    |  8     | 2018-01-01

如果有什么问题的话。我必须报告该行id == 3是错的。

但是当我使用聚合函数时,有关的信息id丢失了。

如果这可能的话那就太棒了:

select current(id), name, max(amount) from table group by name
select aggregated_row(id), name, max(amount) from table group by name

Here agg_row引用聚合函数选择的行max

UPD
我将任务解决为:

SELECT 
    (
       SELECT id FROM t2 
       WHERE id = ANY ( ARRAY_AGG( tf.id ) ) AND amount = MAX( tf.amount ) 
    ) id,
    name, 
    MAX(amount) ma,
    SUM( ratio )
FROM t2  tf
GROUP BY name

UPD
使用的话会好很多窗函数 https://stackoverflow.com/a/52556512/4632019


至少有3种方法,见下文:

CREATE TEMP TABLE test (
    id integer, name text, amount numeric, datefrom timestamptz
);

COPY test FROM STDIN (FORMAT csv);
3,a,8,2018-01-01
4,a,3,2018-01-15 10:00
5,b,1,2018-02-20
6,b,1,2019-01-01
\.

方法 1. 使用 DISTINCT ON(特定于 PostgreSQL)

SELECT DISTINCT ON (name)
  id, name, amount
FROM test
ORDER BY name, amount DESC, datefrom ASC;

方法2.使用窗口函数

SELECT id, name, amount FROM (
  SELECT *, row_number() OVER (
    PARTITION BY name
    ORDER BY amount DESC, datefrom ASC) AS __rn
  FROM test) AS x
WHERE x.__rn = 1;

方法3.使用相关子查询

SELECT id, name, amount FROM test
WHERE id = (
  SELECT id FROM test AS t2
  WHERE t2.name = test.name
  ORDER BY amount DESC, datefrom ASC
  LIMIT 1
); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取聚合函数选择的行的id? [复制] 的相关文章

随机推荐