You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Microsoft Access SQL查询:按街区获取最近40条销售记录

解决Access中按街区分组取最近40条销售记录的SQL方案

嘿,针对你在Access里需要按NBHD分组获取每组最近40条销售记录的需求,我整理了几种可行的方案,还考虑了同一PARID的处理情况,一起来看看:

基础方案:使用窗口函数(Access 2010+适用)

如果你的Access版本是2010及以后,推荐用ROW_NUMBER()窗口函数,语法简洁且性能不错:

SELECT PARID, PRICE, SALEDT, SALEVAL, NBHD
FROM (
    SELECT 
        PARID, PRICE, SALEDT, SALEVAL, NBHD,
        -- 按NBHD分组,每组内按销售时间倒序排号
        ROW_NUMBER() OVER (PARTITION BY NBHD ORDER BY SALEDT DESC) AS RowNum
    FROM YourTableName -- 替换成你的实际表名
) AS RankedSales
WHERE RowNum <= 40; -- 取每组前40条

这个查询的逻辑很清晰:子查询里给每个NBHD分区内的记录按销售时间从新到旧编号,外层筛选出编号≤40的记录,就得到了每个街区最近的40条销售数据。

处理同一PARID的情况

如果你希望同一PARID只保留最近的一条销售记录,再取每个NBHD的前40条,可以嵌套一层窗口函数先处理PARID:

SELECT PARID, PRICE, SALEDT, SALEVAL, NBHD
FROM (
    SELECT 
        PARID, PRICE, SALEDT, SALEVAL, NBHD,
        ROW_NUMBER() OVER (PARTITION BY NBHD ORDER BY SALEDT DESC) AS RowNum
    FROM (
        SELECT 
            PARID, PRICE, SALEDT, SALEVAL, NBHD,
            -- 先给每个PARID的记录按销售时间倒序排,只留最近的一条
            ROW_NUMBER() OVER (PARTITION BY PARID ORDER BY SALEDT DESC) AS ParRowNum
        FROM YourTableName
    ) AS ParRanked
    WHERE ParRanked.ParRowNum = 1
) AS NbhdRanked
WHERE NbhdRanked.RowNum <= 40;

内层子查询先筛选出每个PARID的最新销售记录,外层再按NBHD分组取前40条,完美解决同一PARID的重复问题。

兼容老版本Access的方案(无窗口函数)

如果你的Access版本不支持窗口函数,可以用子查询计数的方式实现:

SELECT t1.PARID, t1.PRICE, t1.SALEDT, t1.SALEVAL, t1.NBHD
FROM YourTableName t1
WHERE (
    SELECT COUNT(*) 
    FROM YourTableName t2
    WHERE t2.NBHD = t1.NBHD 
    -- 按销售时间倒序,时间相同时按PARID排序避免重复计数
    AND (t2.SALEDT > t1.SALEDT OR (t2.SALEDT = t1.SALEDT AND t2.PARID >= t1.PARID))
) < 40
ORDER BY t1.NBHD, t1.SALEDT DESC;

这个方法通过计算每条记录在所属NBHD中比它新(或时间相同但PARID更大)的记录数量,只要数量小于40,就说明这条记录属于前40条。注意如果数据量较大,这个方法的性能可能不如窗口函数。

注意事项

  • 记得把YourTableName替换成你实际使用的表名
  • 确保SALEDT字段是日期/时间类型,这样排序才会正确
  • 如果有相同销售时间的记录,根据你的需求调整排序规则(比如加上PRICEPARID作为辅助排序字段)

内容的提问来源于stack exchange,提问作者Jsqsh

火山引擎 最新活动