Mysql lead / first_value /


查找產品的最新不良代碼 (一個產品對應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 選的是最多的那個值。

 

 

 

 

 

 

 

 

 

 

 

 





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM