• 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 选的是最多的那个值。





    但愿人长久 千里共婵娟
  • 相关阅读:
    修复 XE8 for Android 方向传感器 headingX,Y,Z 不会动的问题
    修复 XE8 for Android 分享图片到 Gmail 权限不足的问题
    Firemonkey 载入 Style 皮肤 (*.fsf 二进制文件) 速度测试
    调整 FMX Android 文字显示「锯齿」效果
    [原创工具] ListView 调色盘 (Free)
    有关Linux的可执行程序
    Android 下配置一个 /dev/fb0 节点出来
    Android下运行Linux可执行程序
    数据库的范式
    rk3128 适配 USB 摄像头
  • 原文地址:https://www.cnblogs.com/hellcats/p/12944749.html
Copyright © 2020-2023  润新知