3

MSAccessで次のOracleクエリに相当するものを探しています。Lag Over(Partition by)関数はMS Accessでは使用できないことを知っていますが、MSAccessを使用して以下のクエリと同じ機能を実現することを探しています。入力に感謝します。

select  t.*,
to_char(date1,'yyyymm') month,
lag(value1,1,0) over(partition by Id1,name1,office,product,overall order by date1)    prev_val
from  test_prev t
order by name1,
office,
overall,
date1,
product
4

2 に答える 2

4

Oracleの例から作業し、クエリを検討すると、サブクエリが適している場合があります。そうでない場合は、ユーザー定義関数が可能です。

これは、product_idによって前の注文日を返します

SELECT Orders.ORDER_DATE, 
       Orders.PRODUCT_ID, 
       Orders.QTY, 
      (SELECT Top 1 o.Order_Date 
       FROM Orders o 
       WHERE o.Order_Date<Orders.Order_Date 
       AND o.Product_ID=Orders.Product_ID 
       ORDER BY o.Order_Date DESC) AS PreviousOrder
FROM Orders
ORDER BY Orders.ORDER_DATE, Orders.PRODUCT_ID

サンプルデータでは、product_idごとに注文ごとに日付が異なるため、ORDER BY日付のみのサブクエリで十分ですが、Accessの上位クエリは一致するため、重複する可能性がある場合は、関連するもので注文するのが最適です。フィールドと一意のID。

于 2012-08-23T08:54:53.877 に答える
0

このようなもの:

SELECT p4.*, p5.qty AS qtyNext
FROM (
SELECT p1.ID, p1.qty,
(SELECT MAX(p3.price) FROM myTbl p3 WHERE p3.price < p1.price) AS prev_price, 
p1.price AS current_rec, 
(SELECT MIN(p2.price) FROM myTbl p2 WHERE p2.price > p1.price) AS next_price
FROM myTbl AS p1 
) AS p4
INNER JOIN myTbl AS p5 
ON p4.next_price=p5.price;

しかし、そのような出力の表現があなたに合っているかどうかを確認してください(-価格に重複がある場合-すべてのレコードが出力に到達しているように見えます)...

于 2021-10-10T07:06:23.220 に答える