【问题标题】:How to grouping with distinct or group max sql如何使用 distinct 或 group max sql 进行分组
【发布时间】:2019-10-02 06:03:34
【问题描述】:

我有这样的日期数据

id      name period difference 
6172    A      6      10 
6172    A      3      10 
10099   AB     12     24 
10099   AB     6      24 
10099   AB     3      24 
10052   ABC    12     26 
10052   ABC    6      26 
10052   ABC    3      26 
9014    ABCD   12     21 
9014    ABCD   6      21 
9014    ABCD   3      21

如何得到这样的结果

id      name    period  difference
6172    A         6      10
10099   AB        12     24
10052   ABC       12     26
9014    ABCD      12     4

我尝试使用 distinct on (id),但结果是这样的

id     name    period   difference
6172    A         6      10
10099   AB        6      24
10052   ABC       6      26
9014    ABCD      6      4

【问题讨论】:

  • 为什么 9014 周期=3 和差异=4?
  • 为什么ABCD的结果应该是3,最大值也是12..
  • ABCD 的预期差异仍然是关闭的,应该是 21,而不是 4。

标签: sql postgresql max grouping distinct


【解决方案1】:

您想要的查询类似于:

SELECT DISTINCT ON (id) *
FROM Data
ORDER BY id, period DESC;

Demo

这可能是在 Postgres 上编写查询的最有效方式。请注意DISTINCT ON 语法不支持ON 子句中的多于一列。假设id 将唯一标识每个组(即id 将始终是唯一的),上述逻辑恰好在这里起作用。如果没有,那么我们可能不得不使用ROW_NUMBERidname. 上的分区

【讨论】:

  • * 之前的逗号可能不应该在那里,否则可能是提问者正在寻找的。​​span>
  • @YonathanRizkyNathanael Shana tovah 兄弟:-P
【解决方案2】:

使用max()

select id, name, t2.period, difference from tableA t1
inner join 
 (select id, max(period) as period from tableA
 group by id) t2 on t2.id = t1.id

使用distinct()

select distinct id, name, t2.period, difference from tableA 

【讨论】:

  • 谢谢大佬帮忙,我不能用max(句号),因为句号字段是上一个查询的别名字段
【解决方案3】:

看来你只需要max()

select id,name,max(period),max(difference)
from table group by id,name

虽然我在您的示例数据中没有发现差异 = 4,但您在输出中使用了它,所以我猜是您的错字

【讨论】:

  • 谢谢大佬帮忙,我不能用max(句号),因为句号字段是上一个查询的别名字段
【解决方案4】:

使用max()

select id, name, max(period), difference from tablename
group by id, name,difference 

【讨论】:

  • 谢谢大佬帮忙,我不能用max(句号),因为句号字段是上一个查询的别名字段
【解决方案5】:

你可以试试我的代码:

SELECT
  id, name, max(period), difference
FROM 
  data_table
group by id, name,difference
order by name

这是一个演示链接http://sqlfiddle.com/#!17/9ab8d/2

【讨论】:

  • 谢谢大佬帮忙,我不能用max(句号),因为句号字段是上一个查询的别名字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多