2014-09-22 43 views
0

我在数据库中有两列:如何选择一列上不同,而返回其他列

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

值是float和时间以毫秒为单位的时代整数

我试图优化这个查询会返回几千行。

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以及价格DISTINCT。有没有办法在截断日期只选择DISTINCT并获取价格列。

+0

首先你显示一个名为'Value'的列表,然后继续一个名为'price'的列?同样''也得到价格栏''没有定义你想要的。显然,你想要将具有相同截断时间戳的行集合合并为一个。您必须定义*从该集合中选择哪个*价格。第一,最后,平均,随机,随意选择? – 2014-09-23 04:09:29

回答

0

若要为DISTINCT ON选取任意一个相同的价格truncated(其适合你不存在的定义):

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已经提供。

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

0

最低的价格变化也许可能的解决方案是一群以截断日期列和计算价格列的平均值:

SELECT truncated, 
     AVG(price) 
    FROM data 
GROUP 
    BY truncated 
相关问题