在mysql中使用最新的“effective_date”返回行

问题描述:

通过查看其他示例无法连接点。在写这篇文章的时候寻找一些帮助,这样它就会为每个9DVN取回最新的条目:也就是说,将最后一个生效日期的一行数据拉回来。在mysql中使用最新的“effective_date”返回行

SELECT b.vndr_name AS Supplier, 
      a.VENDOR_NBR*1000 + a.VENDOR_DEPT_NBR*10 + a.VENDOR_SEQ_NBR AS "9DVN", 
      a.VENDOR_NBR AS "6DVN",a.VENDOR_DEPT_NBR AS "Dept", 
      a.VENDOR_SEQ_NBR AS "Seq" ,a.FREIGHT_FACTOR_PCT AS "Rate", 
      a.Effective_Date AS "Effect Date", 
      a.LAST_CHANGE_USERID AS "By", 
      COUNT(a.DC_NBR) AS "DC Count" 
    FROM MainTable.DC_FRT_FCTR a 
    INNER JOIN SecondaryTable ON b.vndr_nbr = a.vendor_nbr 
    ORDER BY a.Effective_Date DESC 
    GROUP BY B.vndr_name, 
    a.VENDOR_NBR, 
    a.VENDOR_DEPT_NBR, 
    a.VENDOR_SEQ_NBR, 
    a.FREIGHT_FACTOR_PCT, 
    Effective_Date, 
    a.LAST_CHANGE_USERID 
+0

您的'DC_FRT_FCTR'表是否有一列标识不同的'9DVN'值? –

+0

这个问题已经在[tag:greatest-n-per-group]标签下回答了数百次。 –

+0

不,它不。 9dvn是三个字段的连接 – Russell

这是一种常见的查询模式:查找与特定列的极值相关联的详细信息行。

您需要一个子查询来查找每个供应商的极端值 - 在您的案例中是最新生效日期。像这样:

    SELECT MAX(Effective_Date) Effective_Date, 
          VENDOR_NBR*1000 + VENDOR_DEPT_NBR*10 + VENDOR_SEQ_NBR "9DVN" 
        FROM DC_FRT_FCTR 
       GROUP BY VENDOR_NBR*1000 + VENDOR_DEPT_NBR*10 + VENDOR_SEQ_NBR 

你应该测试这个子查询,以确保它产生理智的结果。

然后,您需要将它加入到您的查询的其余部分,如极端值。

SELECT b.vndr_name AS Supplier, 
      a.VENDOR_NBR*1000 + a.VENDOR_DEPT_NBR*10 + a.VENDOR_SEQ_NBR AS "9DVN", 
      ...etc... 
      COUNT(a.DC_NBR) AS "DC Count" 
    FROM MainTable.DC_FRT_FCTR a 
    JOIN (
        SELECT MAX(Effective_Date) Effective_Date, 
          VENDOR_NBR*1000 + VENDOR_DEPT_NBR*10 + VENDOR_SEQ_NBR "9DVN" 
        FROM DC_FRT_FCTR 
       GROUP BY VENDOR_NBR*1000 + VENDOR_DEPT_NBR*10 + VENDOR_SEQ_NBR 
     ) latest 
       ON latest.9DVN = a.VENDOR_NBR*1000 + a.VENDOR_DEPT_NBR*10 + a.VENDOR_SEQ_NBR 
      AND latest.Effective_Date = a.Effective_Date 
    JOIN SecondaryTable b 
       ON b.vndr_nbr = a.vendor_nbr 
ORDER BY a.Effective_Date DESC 
GROUP BY B.vndr_name, 
      ... etc ... 
+0

谢谢!我会尝试并提供更新。 – Russell