簡體   English   中英

給定日期和sql中的公共值,從查詢中提取行數據

[英]Extract row data from query given a date and a common value in sql

我有下表:

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 中表現更好。

這是您可以使用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;

但是,當然這不會給你想要的結果...... 這是一個演示,你可以在其中看到這個例子的實際效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM