如何在返回其他列时选择一列上的distinct

时间:2014-09-22 15:58:12

标签: sql postgresql distinct

我在数据库中有两列:

Value | Date
---------------------
1.3   | 1410374280000

值是一个浮点数,日期是一个以毫秒为单位的纪元整数

我正在尝试优化此查询,因为这会返回几千行。

SELECT * FROM data WHERE date >= [some_time_in_the_past]

由于我在前端渲染图表,因此我需要的数据点要少得多。所以我要截断日期。

SELECT data.date / 5000 * 5000 AS truncated, data.price FROM data
WHERE date >= [some_time_in_the_past]

以上将此日期截断为每5秒。所以现在我想SELECT DISTINCT就可以了。

然而:

SELECT DISTINCT truncated, price 

这将对truncated_date以及价格进行SELECT DISTINCT。有没有办法只在截断日期上选择SELECT DISTINCT并获得价格列。

3 个答案:

答案 0 :(得分:0)

distinct on

select distinct on (truncated) *
from (
    select data.date / 5000 * 5000 as truncated, data.price
    from data
    where date >= [some_time_in_the_past]
) s
order by truncated, price desc

如果您希望从price descprice asc

的价格变动最低

答案 1 :(得分:0)

可能的解决方案是按截断日期列进行分组并计算价格列的平均值:

SELECT truncated,
       AVG(price)
  FROM data
 GROUP
    BY truncated

答案 2 :(得分:0)

为每组相同的truncated(适合您不存在的定义)选择DISTINCT ON的任意价格:

SELECT DISTINCT ON (1)
       (date / 5000) * 5000 AS truncated, price
FROM   data
WHERE  date >= [some_time_in_the_past]
ORDER  BY 1;

添加更多ORDER BY表达式以选择更具体的内容,例如已提供的@Clodoaldo。

相关问题