![](/img/trans.png)
[英]SQL Select unique values by one column with the latest value by another column
[英]SQL select value from one column based on values in another column
我有兩張桌子。 一個存儲“位置”:
TABLE location (
ID serial PRIMARY KEY,
name text NOT NULL,
description text NOT NULL
);
每個位置都有許多行“數據”:
TABLE data(
ID smallint REFERENCES location(ID),
date date,
rainfall int
);
我想找到所有具有給定時間段內“數據”的位置。 我已經試過了:
SELECT location.ID, location.name FROM location
JOIN data ON data.id = location.id
WHERE (SELECT MIN(data.date) FROM data) <= '$start_date'
AND
(SELECT MAX(data.date) FROM data) >= '$end_date'
ORDER BY location.ID;
但似乎將MIN和MAX測試應用於所有數據,而不是應用於每個單獨的位置,即測試需要應用於每個位置,並且僅返回通過測試的那些位置。
有什么建議么?
只需按位置匯總,然后從HAVING
子句中聲明最小值/最大值即可:
SELECT
l.ID,
l.name
FROM location l
INNER JOIN data d
ON d.id = l.id
GROUP BY
l.ID
HAVING
MIN(data.date) <= '$start_date' AND
MAX(data.date) >= '$end_date'
ORDER BY
l.ID;
當你說跨越一定時期內,為什么不使用between
像下面
SELECT location.ID, location.name FROM location location
JOIN data d ON d.id = location.id WHERE d.date between '$start_date' AND '$end_date' ORDER BY location.ID;
請注意,兩個日期都包含在內
您可以將查詢結果加入這些值,並在where
條件中使用
SELECT location.ID, location.name FROM location
JOIN data ON data.id = location.id
JOIN (
SELECT MIN(date) AS _min,MAX(date) AS _max,id
FROM data
GROUP BY id
) T ON T.id = location.id
WHERE T._min <= '$start_date' AND T._max >= '$end_date'
ORDER BY location.ID;
只是為了澄清-我理解您想獲取在那些時間跨度中具有data
locations
所有data
(示例暗示這就是您想要的)
如果要獲取在該時間范圍內發生的所有data
,這不是您想要的解決方案,則需要@ jusermar10或@Yogs提供的between
解決方案
您可以使用between子句獲得所需的結果
SELECT l.ID, l.name FROM location l
inner JOIN data d ON d.id = l.id
WHERE d.date between '$start_date' and '$end_date' group by l.id
當您說跨越給定時間段時,我想您的意思是僅輸出所有其data.date
在$start_date
和$end_date
之間的位置。
在這種情況下,此查詢應該起作用:
SELECT location.ID, location.NAME FROM locations, data
WHERE locations.ID=data.ID
GROUP BY locations.ID
HAVING min(data.date) >= '$start_date' and max(data.date) <= $end_date;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.