T-SQL中如何基于datediff函数获取唯一ID分组的最小时间差值
原SQL问题说明
- 带空格的列名
Start Time、End Time没有做转义处理,SQL解析时会直接报语法错误,不同数据库转义规则不同,MySQL用反引号,SQL Server用方括号,PostgreSQL用双引号。 - 聚合函数
MIN()不能放在WHERE子句里:WHERE是用来做分组前的行级过滤的,聚合计算是分组之后才执行的,不可能在分组前就用聚合结果做筛选。 - 你的需求是取每个ID分组下的最小时间差,直接把
MIN()作用在时间差计算逻辑上作为返回字段即可,不需要额外写筛选条件。
正确SQL示例(MySQL环境)
SELECT ID, CONCAT(MIN(TIMESTAMPDIFF(HOUR, `Start Time`, `End Time`)), ' hours') AS `Elapsed Time` FROM t GROUP BY ID
如果使用其他数据库,只需要调整对应的时间差函数和字符串拼接规则即可:
- SQL Server:时间差计算用
DATEDIFF(HOUR, [Start Time], [End Time]),字符串拼接支持CONCAT函数 - PostgreSQL:时间差计算用
EXTRACT(HOUR FROM ("End Time" - "Start Time")),字符串拼接可以用||运算符或者CONCAT函数
运行后就能得到你想要的每个ID对应最小耗时的结果。
内容的提问来源于stack exchange,提问作者Jacob Davis
相关产品推荐
相关产品推荐

