Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从同一个表中获取最小(日期)、最大(日期)及其数量?_Mysql_Sql_Database_Oracle - Fatal编程技术网

Mysql 如何从同一个表中获取最小(日期)、最大(日期)及其数量?

Mysql 如何从同一个表中获取最小(日期)、最大(日期)及其数量?,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,我是sql编码的新手,我正在尝试学习一些新的东西。因此,我创建了一个带有一些属性的交货表,如项目代码、交货日期、交货数量。所以 如何从同一个表中获取首次交货日期(最小日期)和交货数量,以及最新交货日期(最大日期)及其交货数量 我尝试使用union子句来获取最小(日期)和最大(日期)及其数量。但是输出并不像我想象的那样显示 这是我试过的 SELECT item_code , MAX(date) AS "Latest_delivery_date", quantity FROM delivery WH

我是sql编码的新手,我正在尝试学习一些新的东西。因此,我创建了一个带有一些属性的交货表,如项目代码、交货日期、交货数量。所以 如何从同一个表中获取首次交货日期(最小日期)和交货数量,以及最新交货日期(最大日期)及其交货数量

我尝试使用union子句来获取最小(日期)和最大(日期)及其数量。但是输出并不像我想象的那样显示

这是我试过的

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子句。谢谢你给我看一些新东西。