2

我正在运行这个查询。

SELECT 
  t1.quantity, 
  t2.transaction_date, 
  t1.product_id 
FROM 
  ezsystem_usah.invoice_line AS t1     
  INNER JOIN ezsystem_usah.invoices AS t2 
    ON t1.invoice_id = t2.id_invoices 
WHERE 
  t2.customer_id = '8000004C-1325619329' 
  AND ( product_id = '8000016F-1325198704' 
     OR product_id = '80000027-1324422404' OR ...);

结果表是:

quantity | transaction_date | product_id
7          2012-01-04         8000016F-1325198704
8          2012-03-05         8000016F-1325198704
1          2012-01-05         11111111-1324422404
...        ...                ...

我想根据特定 product_id 的 MAX(transaction_date) 选择行,以便产生如下内容:

quantity | transaction_date | product_id
8          2012-03-05         8000016F-1325198704
1          2012-01-05         11111111-1324422404

换句话说,从joined table中,我想选择EACH product id的最新条目。

我努力了:

SELECT 
  t1.quantity, 
  MAX(t2.transaction_date), 
  t1.product_id 
FROM 
  ezsystem_usah.invoice_line AS t1 
  INNER JOIN ezsystem_usah.invoices AS t2 ON t1.invoice_id = t2.id_invoices 
WHERE 
  t2.customer_id = '8000004C-1325619329' 
  AND (product_id = '8000016F-1325198704' OR product_id = '80000027-1324422404' OR ...)     
GROUP BY 
 t1.product_id; 

但是数量不对。

我没有尝试过但我认为可能有效的另一种方法是使用HAVING MAX(transaction_date) = ([sub query]),但它似乎很昂贵。

最坏的情况是,我可以为每个产品一个一个地运行查询,但如果可能的话,我想避免这种情况。

谢谢,戴恩

4

4 回答 4

2

这应该可以满足您的要求并且相当有效。产品在内部循环中使用 IN () 检查,因此如果您在 product_id 和 customer_id 上有索引,它应该运行得非常快。还建议对 t1.invoice_id 进行索引。

SELECT 
  t1.quantity, 
  transaction_date, 
  product_id 
FROM 
  ezsystem_usah.invoice_line AS t1     
  JOIN (
    SELECT t3.transaction_date, t3.product_id, t3.id_invoices 
        FROM ezsystem_usah.invoices t3
        JOIN
( SELECT MAX(transaction_date) AS max_transaction_date,
    product_id
    FROM ezsystem_usah.invoices
    WHERE product_id IN (
      '8000016F-1325198704', '80000027-1324422404'
      )
    AND customer_id = '8000004C-1325619329'
    GROUP BY product_id ) AS uniqued
    ON ( t3.transaction_date = uniqued.max_transaction_date
        AND t3.product_id = uniqued.product_id
    )
) AS t2 
ON t1.invoice_id = t2.id_invoices;
于 2012-07-19T22:01:50.057 回答
0

Does this do the trick?

SELECT 
  t1.quantity, 
  transaction_date,
  product_id
FROM 
  ezsystem_usah.invoice_line AS t1 
  INNER JOIN ezsystem_usah.invoices AS t2 ON t1.invoice_id = t2.id_invoices 
WHERE 
  t2.customer_id = '8000004C-1325619329' 
  AND product_id IN ( '8000016F-1325198704', '80000027-1324422404' )   
  AND transaction_date = ( SELECT MAX( inv.transaction_date ) 
                           FROM ezsystem_usah.invoices inv 
                             INNER JOIN ezsystem_usah.invoice_line ln 
                               ON    inv.customer_id = t2.customer_id
                                 AND ln.invoice_id = inv.id_invoices 
                                 AND ln.product_id = t1.product_id
                         )

I took a guess which tables contain the fields product_id and transaction_date as it's not clear from the original query.

于 2012-07-19T21:52:56.963 回答
0

这是一个比较简单的公式

with t as (<your query here>)
select t.*
from t join
     (select t.product_id, max(t.transaction_date) as maxdate
      from t
      group by t.product_id
     ) tmax
     on t.product_id = tmax.product_id and
        t.transaction_date = tmax.maxdate

此解决方案只要求您使用“with”子句包含一次查询。

于 2012-07-19T22:08:59.117 回答
0

您的替代方案是子查询(由其他答案提供),或以下反连接(自连接):

SELECT 
  t1.quantity, 
  t2.transaction_date, 
  t1.product_id 
FROM 
  ezsystem_usah.invoice_line AS t1 
  INNER JOIN ezsystem_usah.invoices AS t2
    ON t1.invoice_id = t2.id_invoices 
  LEFT JOIN ezsystem_usah.invoices AS t3
    ON t3.transaction_date > t2.transaction_date
    AND t3.id_invoices = t2.id_invoices
WHERE 
  t2.customer_id = '8000004C-1325619329' AND
  (t1.product_id = '8000016F-1325198704' OR t1.product_id = '80000027-1324422404' OR ...) AND
  t3.id_invoices IS NULL
GROUP BY 
t1.product_id

这个想法是,如果找到日期大于当前行的发票,它将排除该行。我可能没有完全正确的额外加入。我正在对主键进行一些猜测。

于 2012-07-20T14:38:19.327 回答