首页 > 解决方案 > SQL 查询 - 左连接

问题描述

我有 2 张桌子,一张有所有产品和条带的列表,第二张桌子有产品和价格。我已经加入了这两个表,我需要找出基于乐队的最畅销产品是什么。 在此处输入图像描述

当我加入 2 个表并使用以下查询时

在此处输入图像描述

我得到的是总价值,而不是按乐队划分的。有什么办法可以让乐队分裂。 在此处输入图像描述

我所追求的是类似于下面的查询,其中查询仅识别带内最畅销的产品。 在此处输入图像描述

对此的任何帮助将不胜感激

标签: sqlsqlitejoin

解决方案


而不是聚合,有时像 ROW_NUMBER 这样的窗口函数会派上用场。

ROW_NUMBER 可以根据一个顺序计算一个序号。
然后就可以用来过滤了。

select Band, Product
, UniPrice as "High Selling"
from
(
  select
    prod.Band
  , prod.Product
  , prod.PipelineID
  , price.UniPrice
  , row_number() over (partition by prod.Band order by price.UniPrice desc) as rn
  from Table1 prod
  left join Table2 price 
         on price.PipelineID = prod.PipelineID
  where prod.Band is not null
) q
where rn = 1
order by Band;

结果:

乐队 | 产品 | 高销量
:--- | :-------- | ------------:
一个 | SIM0 | 4.5
乙| B2B | 30
C | 苹果 11 | 850
D | 诺基亚A10 | 600

额外的:

如果在 sqlite 版本上没有实现 row_number,则可以使用相关的子查询。

select Band
, MAX(Product) AS Product
, MAX(UniPrice) as "High Selling"
from
(
  select
    prod.Band
  , prod.Product
  , prod.PipelineID
  , price.UniPrice
  , (select max(price2.UniPrice)
     from Table1 prod2
     join Table2 price2 
       on price2.PipelineID = prod2.PipelineID
     where prod2.Band = prod.Band) as MaxBandPrice
  from Table1 prod
  left join Table2 price 
    on price.PipelineID = prod.PipelineID
  where prod.Band is not null
) q 
where UniPrice = MaxBandPrice
group by Band
order by Band;

在这里测试db<>fiddle


推荐阅读