从给定日期和sql中公共值的查询中提取行数据

问题描述 投票:3回答:2

我有下表:

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

任何帮助将不胜感激。

sql postgresql
2个回答
2
投票

我将在此处使用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中应该会表现更好。


1
投票

[首先,请允许我注意您的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,您可以在这里查看此示例。

© www.soinside.com 2019 - 2024. All rights reserved.