查找產品的最新不良代碼 (一個產品對應N個不良代碼),需要一次性查找多個。
現在以'SBWV3677LVW','SBWV2230H1K' 這兩片為例,每個產品對應多個不良代碼,需要查找兩個最新的不良代碼;
SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, bpd.defect_name FROM bs_product_defect bpd where bpd.product_name in ('SBWV3677LVW','SBWV2230H1K');
方法一:lead()函數:
1)按產品分區,然后按創建時間排序。2)lead是取下一條數據。3)如果下一條數據是空的,這條數據就是最新的
SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, bpd.defect_name, LEAD(bpd.defect_name) OVER (PARTITION BY bpd.product_name ORDER BY bpd.create_time) AS next_defect_name FROM bs_product_defect bpd where bpd.product_name in ('SBWV3677LVW','SBWV2230H1K');
SELECT src.product_name, src.operation_name, src.fb_code, src.check_user, src.create_time, src.grade, src.defect_name FROM (SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, bpd.defect_name, LEAD(bpd.defect_name) OVER (PARTITION BY bpd.product_name ORDER BY bpd.create_time) AS next_defect_name FROM bs_product_defect bpd where bpd.product_name in ('SBWV3677LVW','SBWV2230H1K') ) src WHERE next_defect_name IS NULL;
方法二:first_value 函數:選擇一列第一條數目
SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, defect_name, FIRST_VALUE( bpd.defect_name ) OVER ( partition by bpd.product_name order by bpd.create_time desc) as defect_name, bpd.create_time FROM bs_jdi_product_label bpl LEFT JOIN bs_product_defect bpd ON bpl.product_name = bpd.product_name WHERE bpd.product_name in ('SBWV3677LVW','SBWV2230H);
由上看出,defect_name 是按產品分區,時間倒敘的第一個defect_name ,通過Group by product_name 選取 第一條每個產品的第一個數據。
SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, FIRST_VALUE( bpd.defect_name ) OVER ( partition by bpd.product_name order by bpd.create_time desc) as new_defect_name, bpd.create_time FROM bs_jdi_product_label bpl LEFT JOIN bs_product_defect bpd ON bpl.product_name = bpd.product_name WHERE bpd.product_name in ('SBWV3677LVW','SBWV2230H1K') group by product_name ;
但發現和預想的不一樣,原因是,Group by 是在查詢時就Group by,而partition by 則是在查出結果之后分區。
以上再帥選一層,然后 group by 。
select src.product_name, src.operation_name, src.fb_code, src.check_user, src.create_time, src.grade, src.defect_name from (SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, FIRST_VALUE( bpd.defect_name ) OVER ( partition by bpd.product_name order by bpd.create_time desc) as defect_name FROM bs_jdi_product_label bpl LEFT JOIN bs_product_defect bpd ON bpl.product_name = bpd.product_name WHERE bpd.product_name in ('SBWV3677LVW','SBWV2230H1K') ) src group by product_name ;
可能是我用的方法不對:突然想起套一層,直接用group by 不是也可以,試一下:
select src.product_name, src.operation_name, src.fb_code, src.check_user, src.create_time, src.grade, src.defect_name from (SELECT bpd.product_name, bpd.operation_name, bpd.fb_code, bpd.check_user, bpd.create_time, bpd.grade, defect_name FROM bs_jdi_product_label bpl LEFT JOIN bs_product_defect bpd ON bpl.product_name = bpd.product_name WHERE bpd.product_name in ('SBWV3677LVW','SBWV2230H1K') ) src group by product_name ;
不可以,可能Group by 選的是最多的那個值。