如何查询首次攻击恰好发生在1885年的唯一军队名称 支持窗口函数方案
SQL查询需求解决方案
原有语句问题分析
现有语句仅过滤出存在1885年攻击记录的军队,未校验该攻击是否为对应军队的首次攻击,因此会把1885年前已有攻击记录的军队也纳入结果,不符合需求。
方案1:分组聚合实现(全数据库兼容)
直接按军队名称分组,取每支军队的最早攻击时间,判断最早时间是否落在1885年即可,无需窗口函数支持,兼容性最高。
SELECT army_name FROM army_attack GROUP BY army_name HAVING MIN(first_attacked_at) BETWEEN '1885-01-01' AND '1885-12-31';
如果你的数据库支持年份提取函数,也可以简化时间判断逻辑:
-- MySQL 写法 SELECT army_name FROM army_attack GROUP BY army_name HAVING YEAR(MIN(first_attacked_at)) = 1885; -- PostgreSQL 写法 SELECT army_name FROM army_attack GROUP BY army_name HAVING EXTRACT(YEAR FROM MIN(first_attacked_at)) = 1885;
方案2:窗口函数实现
如果你的数据库支持窗口函数(MySQL 8.0+、PostgreSQL 9.4+、SQL Server 2012+等),可以通过排序标记每支军队的首次攻击记录,再过滤时间条件:
WITH attack_sort AS ( SELECT army_name, first_attacked_at, -- 按军队分组,攻击时间升序排序,首次攻击的记录rn为1 ROW_NUMBER() OVER (PARTITION BY army_name ORDER BY first_attacked_at ASC) AS rn FROM army_attack ) SELECT army_name FROM attack_sort WHERE rn = 1 AND first_attacked_at BETWEEN '1885-01-01' AND '1885-12-31';
内容的提问来源于stack exchange,提问作者Luke Skywalker
相关产品推荐
相关产品推荐

