Mysql 如何从同一个表中获取最小(日期)、最大(日期)及其数量?
我是sql编码的新手,我正在尝试学习一些新的东西。因此,我创建了一个带有一些属性的交货表,如项目代码、交货日期、交货数量。所以 如何从同一个表中获取首次交货日期(最小日期)和交货数量,以及最新交货日期(最大日期)及其交货数量 我尝试使用union子句来获取最小(日期)和最大(日期)及其数量。但是输出并不像我想象的那样显示 这是我试过的Mysql 如何从同一个表中获取最小(日期)、最大(日期)及其数量?,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,我是sql编码的新手,我正在尝试学习一些新的东西。因此,我创建了一个带有一些属性的交货表,如项目代码、交货日期、交货数量。所以 如何从同一个表中获取首次交货日期(最小日期)和交货数量,以及最新交货日期(最大日期)及其交货数量 我尝试使用union子句来获取最小(日期)和最大(日期)及其数量。但是输出并不像我想象的那样显示 这是我试过的 SELECT item_code , MAX(date) AS "Latest_delivery_date", quantity FROM delivery WH
SELECT item_code , MAX(date) AS "Latest_delivery_date", quantity
FROM delivery
WHERE item_code='110192'
GROUP BY item_code
union all
SELECT item_code , MIN(date) AS "First_delivery_date", quantity
FROM delivery
WHERE item_code='110192'
GROUP BY item_code;
我希望输出看起来像
您可以使用
分析函数,如下所示:
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
交货日期创建一个派生表,然后将其加入到表中,以查找这些日期的数量。例如:
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
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
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
要为一个特定的项目\u code
选择结果,请在派生表中添加WHERE
子句。这将限制该表的结果仅限于该项的行\u code
,从而使后续的联接更有效。例如:
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
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
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
如果有很多项目,我想过滤项目代码怎么办?我应该将项_code='010997'放在哪里?@newbeginner将where item_code='010997'
放在派生表中最有效。这将把表中的结果减少到一行,从而使后续的连接速度更快。我已经尝试过了,它很有效。代码更容易理解。谢谢你的帮助,sir@newbeginnner不幸的是,你不能接受两个答案!我很高兴您有了一个有效的解决方案。@NewBeginner只需将其添加到派生表中即可。看到这个演示了吗!因为我是sql编码新手,所以我不知道Over Partition By子句。谢谢你给我看一些新东西。