2021-12-08 sql 的窗口函数和非等值自连接——多TM拗口的名字,确是如此优雅的实现

有如下表

SELECT
    *
FROM
    DistrictProducts;
    
 district | name | price 
----------+------+-------
 东北     | 橘子 |   100
 东北     | 苹果 |    50
 东北     | 葡萄 |    50
 东北     | 柠檬 |    30
 关东     | 柠檬 |   100
 关东     | 菠萝 |   100
 关东     | 苹果 |   100
 关东     | 葡萄 |    70
 关西     | 柠檬 |    70
 关西     | 西瓜 |    30
 关西     | 苹果 |    20
(11 rows)

求如何得出按地区区分,按价格排序表:

 district | name | max | rank1 
----------+------+-----+-------
 东北     | 橘子 | 100 |     1
 东北     | 苹果 |  50 |     2
 东北     | 葡萄 |  50 |     2
 东北     | 柠檬 |  30 |     4
 关东     | 苹果 | 100 |     1
 关东     | 柠檬 | 100 |     1
 关东     | 菠萝 | 100 |     1
 关东     | 葡萄 |  70 |     4
 关西     | 柠檬 |  70 |     1
 关西     | 西瓜 |  30 |     2
 关西     | 苹果 |  20 |     3
(11 rows)

最先想到的一定是窗口函数,如果没学过,请速去学,否则简洁和优雅将与你无缘。

SELECT
    district,
    name,
    price,
    RANK() OVER(
        PARTITION BY district
        ORDER BY
            price DESC
    )
FROM
    DistrictProducts;

如果不用窗口函数,如何实现?问题是现在这个节点,没窗口函数的sql db可以考虑更新了:

非等值自连接查询,请收下:

SELECT
    district,
    name,
    price,
    (
        SELECT
            count(price)
        FROM
            DistrictProducts AS dp
        WHERE
            dp.price > dp1.price
            AND dp.district = dp1.district
    ) + 1 AS rank1
FROM
    DistrictProducts AS dp1;

什么?不够复杂,不能体验智商。

非等值查询+聚合函数+外连接查询,请收下:

SELECT
    dp.district,
    dp.name,
    max(dp.price),
    count(dp2.name) + 1 AS rank1
FROM
    DistrictProducts AS dp
    LEFT OUTER JOIN DistrictProducts AS dp2 ON dp.price < dp2.price
    AND dp.district = dp2.district
GROUP BY
    dp.district,
    dp.name
ORDER BY
    dp.district,
    rank1;

所以,还不快去学窗口函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不停感叹的老林_<C 语言编程核心突破>

不打赏的人, 看完也学不会.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值