您可以使用analytical functions
如下:
SQL> CREATE TABLE DELIVERY (
2 ITEM_CODE NUMBER,3 DATE_ DATE,4 QUANTITY NUMBER
5 );
Table created.
SQL>
SQL> INSERT INTO DELIVERY VALUES (
2 110192,3 DATE '2019-05-05',4 30
5 );
1 row created.
SQL>
SQL> INSERT INTO DELIVERY VALUES (
2 110192,3 DATE '2019-01-01',4 10
5 );
1 row created.
SQL>
SQL> INSERT INTO DELIVERY VALUES (
2 110192,3 DATE '2019-10-10',4 25
5 );
1 row created.
SQL>
SQL> INSERT INTO DELIVERY VALUES (
2 110192,3 DATE '2019-08-08',4 19
5 );
1 row created.
SQL>
SQL> SELECT DISTINCT
2 ITEM_CODE,3 MIN(DATE_) OVER(
4 PARTITION BY ITEM_CODE
5 ) AS FIRST_DELIVERY_DATE,6 MAX(QUANTITY) KEEP(DENSE_RANK FIRST ORDER BY DATE_) OVER(
7 PARTITION BY ITEM_CODE
8 ) AS FIRST_QUANTITY,9 MAX(DATE_) OVER(
10 PARTITION BY ITEM_CODE
11 ) AS LATEST_DELIVERY_DATE,12 MAX(QUANTITY) KEEP(DENSE_RANK FIRST ORDER BY DATE_ DESC NULLS LAST) OVER(
13 PARTITION BY ITEM_CODE
14 ) AS LATEST_QUANTITY
15 FROM
16 DELIVERY;
ITEM_CODE FIRST_DEL FIRST_QUANTITY LATEST_DE LATEST_QUANTITY
---------- --------- -------------- --------- ---------------
110192 01-JAN-19 10 10-OCT-19 25
SQL>
干杯!
,
解决此问题的一种方法是制作一个商品的MIN
和MAX
派生日期的派生表,然后JOIN
回到表中以查找这些物品的数量日期。例如:
SELECT m.item_code,m.min_date AS "First_delivery_date",d1.quantity AS "First_quantity",m.max_date AS "Latest_delivery_date",d2.quantity AS "Latest_quantity"
FROM (SELECT item_code,MAX(date) AS max_date,MIN(date) AS min_date
FROM delivery
GROUP BY item_code) m
JOIN delivery d1 ON d1.item_code = m.item_code AND d1.date = m.min_date
JOIN delivery d2 ON d2.item_code = m.item_code AND d2.date = m.max_date
Demo on dbfiddle
要为一个特定的item_code
选择结果,请在派生表中添加一个WHERE
子句。这样会将该表的结果限制为该item_code
的行,从而使后续JOIN
的效率更高。例如:
SELECT m.item_code,MIN(date) AS min_date
FROM delivery
WHERE item_code = '010997'
GROUP BY item_code) m
JOIN delivery d1 ON d1.item_code = m.item_code AND d1.date = m.min_date
JOIN delivery d2 ON d2.item_code = m.item_code AND d2.date = m.max_date
本文链接:https://www.f2er.com/3162435.html