sql为多行选择最早日期
我有一个如下所示的数据库:sql为多行选择最早日期,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有一个如下所示的数据库: circuit_uid | customer_name | location | reading_date | reading_time | amps | volts | kw | kwh | kva | pf | key -----------------------------------------------------------------------------------------------------------
circuit_uid | customer_name | location | reading_date | reading_time | amps | volts | kw | kwh | kva | pf | key
--------------------------------------------------------------------------------------------------------------------------------------
cu1.cb1.r1 | Customer 1 | 12.01.a1 | 2012-01-02 | 00:01:01 | 4.51 | 229.32 | 1.03 | 87 | 1.03 | 0.85 | 15
cu1.cb1.r1 | Customer 1 | 12.01.a1 | 2012-01-02 | 01:01:01 | 4.18 | 230.3 | 0.96 | 90 | 0.96 | 0.84 | 16
cu1.cb1.s2 | Customer 2 | 10.01.a1 | 2012-01-02 | 00:01:01 | 7.34 | 228.14 | 1.67 | 179 | 1.67 | 0.88 | 24009
cu1.cb1.s2 | Customer 2 | 10.01.a1 | 2012-01-02 | 01:01:01 | 9.07 | 228.4 | 2.07 | 182 | 2.07 | 0.85 | 24010
cu1.cb1.r1 | Customer 3 | 01.01.a1 | 2012-01-02 | 00:01:01 | 7.32 | 229.01 | 1.68 | 223 | 1.68 | 0.89 | 48003
cu1.cb1.r1 | Customer 3 | 01.01.a1 | 2012-01-02 | 01:01:01 | 6.61 | 228.29 | 1.51 | 226 | 1.51 | 0.88 | 48004
我想做的是生成一个结果,其中每个客户的KWH读数最早(min(reading\u time)
)在该日期,用户将在web表单中选择该日期
结果将/应该类似于
Customer 1 87
Customer 2 179
Customer 3 223
每天的行数超过此处显示的行数,客户数量也更多,并且客户数量会定期变化
我对SQL没有太多的经验,我研究过子查询等,但我不知道如何按照每个客户最早的读数来安排,然后只输出kwh
列
这在Redhat/CentOS上的PostgreSQL 8.4中运行
SELECT rt.circuit_uid , rt.customer_name, rt.kwh
FROM READING_TABLE rt JOIN
(SELECT circuit_uid, reading_time
FROM READING_TABLE
WHERE reading_date = '2012-01-02'
GROUP BY customer_uid
HAVING MIN(reading_time) = reading_time) min_time
ON (rt.circuit_uid = min_time.circuit_uid
AND rt.reading_time = min_time.reading_time);
参数化上述查询中的reading_date值
select customer_name,
kwh,
reading_date,
reading_time
from (
select customer_name,
kwh,
reading_time,
reading_date,
row_number() over (partition by customer_name order by reading_time) as rn
from readings
where reading_date = date '2012-11-17'
) t
where rn = 1
作为替代方案:
select r1.customer_name,
r1.kwh,
r1.reading_date,
r1.reading_time
from readings r1
where reading_date = date '2012-11-17'
and reading_time = (select min(r2.reading_time)
from readings
where r2.customer_name = r1.customer_name
and r2.read_date = r1.reading_date);
但我希望第一个更快
顺便问一句:为什么要将日期和时间存储在两个单独的列中?您是否知道使用
时间戳列可以更好地处理此问题?这应该是最快的解决方案之一:
SELECT DISTINCT ON (customer_name)
customer_name, kwh -- add more columns as needed.
FROM readings
WHERE reading_date = user_date
ORDER BY customer_name, reading_time
似乎是以下各项的另一个应用:
这将给您一个错误,因为kwh
既不在group by
子句中,也不在聚合关系中:请提出新问题。在给出好的答案后,基本上改变问题的性质是不好的。您始终可以链接回此链接以了解上下文。我还原了您的更改,您可以在编辑日志中找到它。时间戳列的优点很好。提取日期或时间是非常简单和快速的:ts_column::date
或ts_column::time
。我想是我缺乏经验才把日期和时间分开的。谢谢你出色的回答。请接受我的道歉并查看修改后的问题。欧文谢谢你的回答,我很抱歉这样修改了问题。您的回答也会对每个问题返回一个完美的结果。@AlanEnnis:没问题。只要问一个新问题,你很快就会有更多的答案。:)