【问题标题】:SQL SELECT Return most recent created date where date in second tableSQL SELECT 返回最近创建的日期,其中第二个表中的日期
【发布时间】:2017-06-16 00:31:39
【问题描述】:

我有一个产品表prdtbl和一个销售历史表postdt

我需要退回最近销售日期的产品,目前我收到重复的产品,其中列出了所有过去的销售,而不仅仅是最近的。

SELECT prdtbl.prdcod,
prdtbl.stkqty,
prdtbl.ordqty,
prdtbl.csoqty,
postdt.crtdat as LastPurchase
FROM (prdtbl
    LEFT JOIN postdt ON prdtbl.prdcod=postdt.itmcod)
WHERE prdtbl.prdcod NOT LIKE '*%'
AND (prdtbl.prdcod NOT LIKE 'CO%'
    or (prdtbl.prdcod LIKE 'CO%' AND prdtbl.stkqty >0 OR prdtbl.ordqty >0 OR prdtbl.csoqty >0))
AND (postdt.crtdat >= '2014-01-01'
    OR (postdt.crtdat < '2014-01-01' AND prdtbl.stkqty >0 OR prdtbl.ordqty >0 OR prdtbl.csoqty >0))
GROUP BY prdtbl.prdcod, postdt.crtdat, prdtbl.ordqty, prdtbl.stkqty, prdtbl.csoqty
ORDER BY prdtbl.prdcod DESC, MAX(postdt.crtdat) DESC

我已经尝试了以下方法,但是由于 postdt 表非常大,返回需要很长时间

AND postdt.crtdat IN ( SELECT MAX(postdt.crtdat) FROM postdt GROUP BY prdtbl.prdcod) 

在最初的 SELECT 查询中,我也尝试过使用以下内容,但这仍然返回重复的产品代码

MAX(postdt.crtdat) as LastPurchase

希望这是有道理的,我仍然对 SQL 有所了解!

【问题讨论】:

标签: sql postgresql select


【解决方案1】:

你最好的选择是DISTINCT ON:

SELECT DISTINCT ON (p.prdcod) p.prdcod, p.stkqty, p.ordqty, p.csoqty, d.crtdat as LastPurchase
FROM prdtbl p LEFT JOIN
     postdt d
     ON p.prdcod = d.itmcod
WHERE p.prdcod NOT LIKE '*%' AND
      (p.prdcod NOT LIKE 'CO%' O
       (p.prdcod LIKE 'CO%' AND p.stkqty > 0 OR p.ordqty > 0 OR p.csoqty > 0
       )
      ) AND
      (d.crtdat >= '2014-01-01' OR
       (d.crtdat < '2014-01-01' AND p.stkqty > 0 OR p.ordqty > 0 OR p.csoqty > 0
       )
      )
GROUP BY p.prdcod, d.crtdat, p.ordqty, p.stkqty, p.csoqty
ORDER BY p.prdcod DESC, p.crtdat DESC;

这会为每个产品返回一行,其中包含最新的销售数据。

【讨论】:

    【解决方案2】:

    最近的销售日期是

    SELECT MAX(crtdat) FROM postdt
    

    最近销售日期的产品代码列表是

    SELECT itmcod FROM postdt WHERE crtdat = (SELECT MAX(crtdat) FROM postdt)
    

    您的查询可能看起来像这样

    SELECT ...
    FROM prdtbl
    WHERE prdcod IN (
      SELECT itmcod FROM postdt WHERE crtdat = (SELECT MAX(crtdat) FROM postdt)
    )
    AND ...
    

    确保您在 postdt.crtdat 列上有一个索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多