我有两张 table 。一个存储“位置”:
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
GROUP BY location.id
HAVING MIN(data.date) <= '$start_date'
AND
MAX(data.date) >= '$end_date'
AND
(SELECT COUNT(*) FROM data WHERE data.date >= '$start_date' AND data.date <= '$end_date') >= '$min'
ORDER BY location.ID
如果我取出倒数第二行(SELECT COUNT 行),它会正确返回具有跨越所需时间段的数据的位置(但没有限制,即所需时间段内的值数大于或等于到“分钟”)。
谁能告诉我如何施加约束? IE。我的“SELECT COUNT 行”有什么问题。
以下示例数据可能有助于阐明我的问题:
示例数据:
location:
ID = 1, name = "London", description = "test location 1"
ID = 2, name = "New York", description = "test location 2"
数据:
ID = 1, date = 2001-01-01, rainfall = 0.0
ID = 1, date = 2001-01-02, rainfall = 0.0
ID = 1, date = 2001-01-03, rainfall = 0.0
ID = 1, date = 2001-01-04, rainfall = 0.0
ID = 1, date = 2001-01-05, rainfall = 0.0
ID = 1, date = 2001-01-06, rainfall = 0.0
ID = 1, date = 2001-01-07, rainfall = 0.0
ID = 2, date = 2001-01-01, rainfall = 0.0
ID = 2, date = 2001-01-04, rainfall = 0.0
ID = 2, date = 2001-01-05, rainfall = 0.0
ID = 2, date = 2017-01-01, rainfall = 0.0 # Not within the desired period, so is excluded
ID = 2, date = 2017-01-02, rainfall = 0.0 # Not within the desired period, so is excluded
ID = 2, date = 2017-01-03, rainfall = 0.0 # Not within the desired period, so is excluded
ID = 2, date = 2017-01-04, rainfall = 0.0 # Not within the desired period, so is excluded
如果我搜索所有包含 2001-01-01 和 2001-01-07 之间数据的位置,并且至少有 6 个数据值,它应该只返回位置 1 (ID=1)。第二个位置 (ID=2) 不应返回,因为它在所需时间段内没有所需数量的值。
最佳答案
这是我的答案的新版本,因为我误解了“跨越”。我对这个问题的解释仍然是,在计算值(value)时,我们应该只在给定的时间段内进行
SELECT l.id, l.name
FROM location l
JOIN location_data d
ON l.id = d.id
GROUP BY l.id, l.name
HAVING MIN(d.date) <= '2017-01-01'
AND MAX(d.date) >= '2017-12-31'
AND (SELECT COUNT(b.id)
FROM location_data b
WHERE b.date BETWEEN '2017-01-01' AND '2017-12-31'
AND b.id = l.id) >= 2
我在我的测试数据库中将表数据重命名为 location_data 但这可能很明显:)
关于SQL 选择 COUNT(*) > 最小数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49218049/