You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询首次攻击恰好发生在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:45:05