SQL 选择 COUNT(*) > 最小数量

标签 sql postgresql select

我有两张 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/

相关文章:

javascript - 单击链接时如何动态获取用户名或详细信息

SQL Server 将分层 CTE 函数重写为常规 Select

sql - 将 postgreSQL 中的多行合并为一行?

sql - postgresql 偏移特定列

php - 从使用 mysql 填充列表的所选选项中打印 2 个值

MySQL - 插入带有 AUTO_INCREMENT 列的 xxx SELECT

sql - BC 日期在 postgreSQL 中是什么意思?

mysql - 使用 union、join 和 limit 查询(不工作)

sql - ruby on rails 参数比较日期和日期时间?

mysql - 仅针对缺失数据提取结果