一、原表表头如下,现需要提取每月销量排名前两名的商家:
列名 | 注释 |
---|---|
order_date | 订单日期 |
seller_name | 商家名称 |
sale_amount | 销售金额 |
二、SQL如下:
SELECT
*
FROM
(
SELECT
extract( YEAR_MONTH FROM ds.order_date ) date,
ds.seller_name seller,
sum( ds.sale_amount ) amount
FROM
table_name ds
GROUP BY
extract( YEAR_MONTH FROM ds.order_date ),
ds.seller_name
) A
WHERE
(
SELECT
COUNT(1)
FROM
(
SELECT
distinct
#distinct在此处使用的作用是为了应对出现并列排名的情况,例如某月存在两个TOP1商家
extract( YEAR_MONTH FROM ds.order_date ) date,
ds.seller_name seller,
sum( ds.sale_amount ) amount
FROM
table_name ds
GROUP BY
extract( YEAR_MONTH FROM ds.order_date ),
ds.seller_name
) B
WHERE
A.date = B.date
AND A.AMOUNT < B.AMOUNT
) <=1
ORDER BY A.DATE,A.AMOUNT DESC
三、思路分解:
STEP1:先做分组,分月分商家对销售金额求和
SELECT
extract( YEAR_MONTH FROM ds.order_date ) date,
ds.seller_name seller,
sum( ds.sale_amount ) amount
FROM
table_name ds
GROUP BY
extract( YEAR_MONTH FROM ds.order_date ),
ds.seller_name
STEP2:将STEP1查询出的表COPY出一个副本,两表通过月份及A.DATE=B.DATE
连接,再增加限定条件A.AMOUNT < B.AMONT
。现如果需要提取每月销量排名前两名的商家,即该月销量第一名商家和销量第二名商家,如果是第一名商家,则满足条件的行记录数为0,如果是第二名商家,则满足条件的行记录数为1。
SELECT
*
FROM
A
WHERE
( SELECT COUNT( 1 ) FROM B WHERE A.DATE = B.DATE AND A.AMOUNT < B.AMONT ) <=1
STEP3:共通过order by ....desc
降序排列