SQL新手求助:查询2015年5月最后一笔销售的ID(原查询报错)
解决2015年5月最后一笔销售的人员ID查询问题
问题根源
你遇到的Sales_Date列不存在错误,核心原因有两个:
- SQL执行顺序是
FROM→WHERE→SELECT,WHERE子句无法使用SELECT中定义的别名(比如year、month、Sales_Date),此时这些别名还未生成。 - 你定义的别名是
Sales_Date(首字母大写),但extract里写的是sales_date(全小写),部分数据库对大小写敏感,会识别为不同列。
另外,CONCAT(' ', CAST(occurred_at AS DATE))多了多余空格,直接用CAST(occurred_at AS DATE)就能得到日期部分,没必要拼接空格。
正确查询语句
要获取2015年5月最后一笔销售的人员ID,最优写法是直接通过occurred_at筛选日期范围,再按时间降序取第一条记录:
SELECT ID FROM <table name> WHERE occurred_at >= '2015-05-01' AND occurred_at < '2015-06-01' ORDER BY occurred_at DESC LIMIT 1;
适配不同数据库的写法
如果你的数据库不支持LIMIT,可以对应调整:
- SQL Server用
TOP 1:
SELECT TOP 1 ID FROM <table name> WHERE occurred_at >= '2015-05-01' AND occurred_at < '2015-06-01' ORDER BY occurred_at DESC;
- Oracle用
ROWNUM:
SELECT ID FROM ( SELECT ID FROM <table name> WHERE occurred_at >= '2015-05-01' AND occurred_at < '2015-06-01' ORDER BY occurred_at DESC ) WHERE ROWNUM = 1;
额外说明
用日期范围筛选(>= '2015-05-01' AND < '2015-06-01')比extract函数更高效,因为数据库可以利用occurred_at列上的索引(如果存在的话),避免全表扫描。
内容的提问来源于stack exchange,提问作者Srividya Srinivasan
相关产品推荐
相关产品推荐

