iT邦幫忙

3

趣味SQL 分組取前兩種

  • 分享至 

  • xImage
create table tab (
   vendor varchar(20)
 , exdate date
 , product varchar(20)
);

insert into tab values
('好吃雞腿', '2021-08-01',  '炸雞腿'),
('好吃雞腿', '2021-08-02',  '炸雞腿'),
('好吃雞腿', '2021-08-03',  '滷雞腿'),
('好吃雞腿', '2021-08-04',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-01',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-02',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-03',  '蜜汁雞腿'),
('黯然排骨', '2021-08-01',  '排骨酥'),
('黯然排骨', '2021-08-02',  '椒鹽排骨'),
('黯然排骨', '2021-08-03',  '紅燒排骨');

方便測試的

想要達到的資料

供應商     月份     產品1     產品2
----------------------------------
好吃雞腿 2021-08   炸雞腿     滷雞腿
好吃雞腿 2021-09   蜜汁雞腿   還是蜜汁雞腿  <-- 若沒別種就加上 還是
黯然排骨 2021-08   排骨酥     椒鹽排骨

使用PG 搭配 array的一種方式

前段使用rank()搭配後段沿用兩個的處理方式

看更多先前的討論...收起先前的討論...
rogeryao iT邦超人 7 級 ‧ 2022-02-14 18:53:22 檢舉
供應商 月份 產品1 產品2
----------------------------------
好吃雞腿 2021-08 炸雞腿 滷雞腿 <---- 裝機關
wu2960 iT邦新手 2 級 ‧ 2022-02-15 08:25:13 檢舉
這問題飄出香味來了
不會純推

元宵節 快樂
微笑 iT邦研究生 5 級 ‧ 2022-02-16 14:28:01 檢舉
後端處理,結案xDD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
SELECT ym,vendor,p1,concat(if(p1=p2,'還是',''),p2) FROM (
SELECT ym,vendor,
	SUBSTRING_INDEX(GROUP_CONCAT(product),",",1) AS p1, 
	SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(product),",",2),",",-1) AS p2 
	FROM (
		SELECT *,DATE_FORMAT(exdate,"%Y%m") AS ym FROM `tab`  GROUP BY exdate,vendor,product ORDER BY exdate
	) AS t group BY ym,vendor
) AS c

這次認真了一下下。

突然發現我的答案是不對的@@"
算了,懶的想了。

1
喵凹咿唉思嗯
iT邦研究生 5 級 ‧ 2022-02-14 17:33:11

保留錯的版本

check

想了一下groupby好像就不太需要用count...

select VENDOR,MONTH, RNK1 產品1,NVL2(RNK2,RNK2,'還是'||RNK1) 產品2 from (
  select 
        rank() over(partition by vendor,trunc(exdate,'mm') order by exdate) rnk,
        product,
        vendor,
        to_char(exdate,'YYYY-MM') month
  from (
  select vendor, min(exdate) exdate, product from tab group by vendor, product,trunc(exdate,'mm')
  ) t
  order by vendor,trunc(exdate,'mm')
  ) pivot
(
    max(product) for rnk in (1 "RNK1",2 "RNK2") 
)
order by 1,2;

滷雞腿

ㄎ 出bug了ww, 懶得想了 小作弊XD

這滷雞腿真的太邪惡, 跟蜜汁雞腿兩邊互卡

4
rogeryao
iT邦超人 7 級 ‧ 2022-02-14 18:39:24
create table tab (
   vendor varchar(20)
 , exdate date
 , product varchar(20)
);

insert into tab values
('好吃雞腿', '2021-08-01',  '炸雞腿'),
('好吃雞腿', '2021-08-02',  '炸雞腿'),
('好吃雞腿', '2021-08-03',  '滷雞腿'),
('好吃雞腿', '2021-08-04',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-01',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-02',  '蜜汁雞腿'),
('好吃雞腿', '2021-09-03',  '蜜汁雞腿'),
('黯然排骨', '2021-08-01',  '排骨酥'),
('黯然排骨', '2021-08-02',  '椒鹽排骨'),
('黯然排骨', '2021-08-03',  '紅燒排骨');
SELECT R.vendor,R.YearMonth,R.product,R.product2
FROM (
SELECT M.vendor,M.YearMonth,M.product,
ROW_NUMBER() OVER (PARTITION BY M.vendor,M.YearMonth ORDER BY M.exdateMIN) AS NO,
LEAD(M.product,1,CONCAT('還是' , M.product)) OVER (PARTITION BY M.vendor,M.YearMonth ORDER BY M.exdateMIN) AS product2
FROM (
SELECT vendor,LEFT(exdate,7) AS YearMonth,product,MIN(exdate) AS exdateMIN
FROM tab
GROUP BY vendor,LEFT(exdate,7),product) M
ORDER BY M.vendor,M.exdateMIN) R
WHERE R.NO = 1

Demo

我要發表回答

立即登入回答