我有下表:
CREATE TABLE my_table
(
the_id varchar(6) NOT NULL,
the_amount int NOT NULL,
the_date date NOT NULL
)
INSERT INTO my_table
VALUES ('LMUS01', '200', '2/12/2019'),
('LMUS01', '200', '2/11/2019'),
('LMUS01', '300', '2/13/2019'),
('LMUS02', '100', '2/10/2019'),
('LMUS02', '150', '2/12/2019')
而且我想要LMUS01的第一天的金额。当我尝试时:
SELECT the_amount, MIN(the_date)
FROM my_table
WHERE the_id = 'LMUS01'
它告诉我the_amount
必须出现在GROUP BY
子句中。但是该组必须为the_id
,我尝试过:
SELECT the_amount, MIN(the_date)
FROM my_table
WHERE the_id = 'LMUS01'
GROUP BY the_id
结果必须是:
200, 2/11/2019
任何帮助将不胜感激。
我将在此处使用LIMIT
:
SELECT *
FROM my_table
WHERE the_id = 'LMUS01'
ORDER BY the_date
LIMIT 1;
要获取每个ID的最早记录,请使用DISTINCT ON
:
SELECT DISTINCT ON (the_id) *
FROM my_table
ORDER BY the_id, the_date;
如果您真的想使原始方法与MIN
函数一起使用,则可以使用子查询:
SELECT *
FROM my_table
WHERE
the_id = 'LMUS01' AND
the_date = (SELECT MIN(the_date) FROM my_table WHERE the_id = 'LMUS01');
但是,我会首先使用其他方法之一,在Postgres中应该会表现更好。
[首先,请允许我注意您的create table
陈述不正确。您有一个postgresql标记,并且表中有一个datetime类型。
我在尝试解决查询时发现的第二件事是,您有一列名为id
并键入varchar(5)
,并且您在该列中插入的值是6个字符长:LMUS01
现在我们已经整理出这里是可以使用min
函数执行的一个选项:
SELECT the_amount, the_date
FROM my_table
WHERE the_id = 'LMUS1' --<< I have changed this because of varchar(5)
and the_date = (select min(the_date)
from my_table
WHERE the_id = 'LMUS1' ); --<< I have changed this because of varchar(5)
您必须了解这将起作用:
select min(the_date)
from my_table
WHERE the_id = 'LMUS1';
而且不会:
select the_amount, min(the_date)
from my_table
WHERE the_id = 'LMUS1';
因为如果它不是聚合函数的一部分,则必须将select子句中的每一列都放在group by子句中。因此,如果您这样编写,则第二个示例将起作用:
select the_amount, min(the_date)
from my_table
WHERE the_id = 'LMUS1'
group by the_amount;
但是,当然不会给您想要的结果...Here is a demo,您可以在这里查看此示例。