首页 > 解决方案 > MYSQL:获取倒数第二个最大值行,但未显示某些日期。为什么?

问题描述

使用此查询(更大查询的子部分):

-- Get second last transaction per item
select max(i.transaction), item
from (
    -- Rows not including max transaction
    select item, transaction
    from positivetest.history_items
    where transaction not in (
        -- Max transaction per item
        select max(transaction) 
        from positivetest.history_items
        group by item
        )
    ) i
group by item

以及以下(相关)数据。(为简单起见,我正在从我的真实数据库中修剪数据,例如项目 0 确实有 16 个条目):

交易 物品
294474 0
294474 0
715439 0
1299009 0
119427 1
137450 1
177632 3
325260 3
669580 3
871509 3
951363 3
539784 4
845808 4
468110 5
965661 5
1326575 5
1327567 5

给出结果:

最大(i.事务) 物品
715439 0
119427 1
871509 3
726859 5

第 4 项在此处未按应有的方式显示。它应该有事务 539784。

运行最里面的选择(每个项目的最大事务)我得到:

最大(交易) 项目(实际上不在结果数据表中)
1299009 0
137450 1
951363 3
845808 4
1327567 5

项目 4 显示了每个项目的正确最大交易量。

下一个选择(不包括最大事务的行)是 4 没有显示的地方以及一些应该显示的值,包括来自 3 和 5 的一些值:

物品 交易
0 294474
0 294474
0 715439
1 119427
3 177632
3 669580
3 871509
5 468110

我很困惑为什么没有显示正确的数据。我希望在这一点之后显示除每个项目的最大交易之外的所有内容。最终选择应该是每个项目的第二大事务,但是由于缺少一些数据,这是不正确的。4 一起失踪。

它是否与查询的执行顺序有关?还是我理解不正确?

我的目标是获得每件商品的第二大交易。也许有更好的方法?

标签: mysql

解决方案


您可以使用ROW_NUMBER(),如:

select *
from (
  select *,
    row_number() over(partition by item order by transaction desc) as rn
  from positivetest.history_items
) x
where rn = 2 -- filtering the second one, using descending order

推荐阅读