【问题标题】:2ND Highest value for each group - SQL每个组的第二个最大值 - SQL
【发布时间】:2021-12-04 07:10:05
【问题描述】:

我有这个数据集:

shopID    supplier    supply_count
1         a           12
2         b           12
2         f           12
2         e           10
3         b           5
3         a           2
4         f           15
4         c           11

我已使用此查询来获得每个组的第二高值:

select s1.shopId, max(s1.supply_count)
from supply s1
where supply_count NOT IN (
   select max(supply_count) 
   from supply s2
   where s1.shopId = s2.shopId
)
group by s1.shopId

我得到的结果是:

shopID   supply_count
2        10
3        2
4        11

期望的输出是: (如果没有第二高我想呈现最高的)

shopID   supply_count
1        12
2        10
3        2
4        11

基于这个问题: Retrieve 2nd highest count by each group

【问题讨论】:

  • 不应该是第二高的 10 for 2 基于输入吗?
  • 12 不是第 1 组的第二个最大值。
  • 但万一没有第二高的我想呈现最高的

标签: sql sql-server tsql


【解决方案1】:
select 
shopID,
supply_count
from
(select shopID,
supply_count, dense_rank() over(partition by shopID order by supply_count desc) as rn
from supply) a
where rnk=2
group by
shopID,
supply_count
union
select shopID,
supply_count
from supply
where shopID in (select shopID from supply group by shopID having count(distinct supply_count) =1) a
group shopID,
supply_count;

我相信这应该可行。我在这里尝试的是通过为每个组分配一个排名并与只有一条记录的 shopID 进行联合来确定第二高的供应数量。

如果您不明白 dense_rank() 的作用,请阅读:https://towardsdatascience.com/how-to-use-sql-rank-and-dense-rank-functions-7c3ebf84b4e8

【讨论】:

  • 对于多行的 shopID,我得到 2 个值。如何才能仅获得超过 1 行的 shopID 的第二高?
  • 修复了查询。
【解决方案2】:

通过计算每个 ShopId 的行数,您可以获得所需的输出以包含每个 shopId 只有一行的值。

基于一些更多样化的数据和 cmets,我相信以下应该会给出预期的结果:

with c as (
    select *,
        case when dense_rank() over(partition by shopid order by supply_count desc)=2 
            or Min(supply_count) over(partition by shopid)
              =Max(supply_count) over(partition by shopid) 
        then 1 else 0 end as valid
    from t
)
select distinct shopId, supply_count
from c
where valid=1

例如DBFiddle with some more varied data

【讨论】:

  • 好。这比我写的要短。
  • 我认为您应该使用 dense_rank() 而不是 row_number() 来进行查询。
  • @manibharataraju 为什么? Dense_rank() 可能会重复行,所以这是供 OP 选择的 - 我的理解是每个 ShopId 1 行
  • @Stu - 如果您查看输入,您可以看到 shopid 2 有两行 12,因此根据您的查询,它将给出 12 作为输出,而答案应该是 10 . 可以在valid=1后加上group by,防止出现多行
  • 是的,实际上我会稍微修改一些更多样化的测试数据。
猜你喜欢
  • 2022-08-23
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2020-12-31
  • 1970-01-01
  • 2022-01-22
  • 2019-07-01
相关资源
最近更新 更多