查找产品的最新不良代码 (一个产品对应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');

Mysql lead / first_value / 

 方法一: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');

Mysql lead / first_value /

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;

Mysql lead / first_value /

方法二: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);

 

 

Mysql lead / first_value /

由上看出,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 ; 

Mysql lead / first_value /

 

 

 但发现和预想的不一样,原因是,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 ; 

 

Mysql lead / first_value /

 

 可能是我用的方法不对:突然想起套一层,直接用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 ; 

 

 Mysql lead / first_value /

不可以,可能Group by 选的是最多的那个值。

 

 

 

 

 

 

 

 

 

 

 

 





 

相关文章:

  • 2021-08-05
  • 2021-05-08
  • 2022-01-18
  • 2021-07-03
  • 2021-11-09
  • 2022-02-08
  • 2022-12-23
猜你喜欢
  • 2021-07-24
  • 2021-06-09
  • 2022-12-23
  • 2021-06-07
  • 2021-10-24
  • 2022-12-23
  • 2022-02-20
相关资源
相似解决方案