我尝试获取一些按日期、编号排序的数据,并获取每件商品的最新价格

Posted

技术标签:

【中文标题】我尝试获取一些按日期、编号排序的数据,并获取每件商品的最新价格【英文标题】:I Try to get some data with order by date, number and get each item last price 【发布时间】:2019-10-01 07:26:07 【问题描述】:

对不起,我是 mysql 的初学者。我想按日期、order_number 对我的数据进行排序,并获取每件商品的购买价格

id | order_number | product_name | order_date | price
 1 | A0919-002    | Bottle       | 2019-09-29 | 20000
 2 | A0919-001    | Bottle       | 2019-09-29 | 10000
 3 | A0819-004    | Bottle       | 2019-08-30 | 40000
 4 | A0819-003    | Bottle       | 2019-08-30 | 30000

我已经尝试过,但无法得到我预期的结果。而且我相信使用这种子查询会影响我的表现。

我正在尝试使用 LEFT JOIN/JOIN,但我想不出我必须做什么。

SELECT id
     , order_number
     , product_name
     , order_date
     , price
     , IFNULL(
           (SELECT price 
              FROM order_d 
             WHERE order_date <= od1.order_date
               AND product_name = od1.product_name 
               AND id != od1.id 
             ORDER 
                BY order_date DESC
                 , CAST(SUBSTRING(order_number, 7, 3) AS INT) DESC 
             LIMIT 1
            ), '-') LastPrice
  FROM order_d od1
 WHERE order_date <= '2019-09-30' 
 ORDER 
    BY od1.order_date ASC
     , CAST(SUBSTRING(od1.order_number, 7, 3) AS INT) ASC

我期待

A0819-003 | Bottle | 30000 : Last Price : -
A0819-004 | Bottle | 40000 : Last Price : 30000
A0919-001 | Bottle | 10000 : Last Price : 40000
A0919-002 | Bottle | 20000 : Last Price : 10000

【问题讨论】:

在您的问题中。 A0919-001 和 A0819-001。这可能吗?能否提供更多数据 日期是一样的,你怎么判断哪个更早? 我认为你需要在mysql中使用lead和lag函数。查看此链接:geeksforgeeks.org/mysql-lead-and-lag-function a.order_number, 7, 3 ?错字? @MohinuddinLuhar 那是旧的数据库设计,我无能为力。或者如果我可以重新设计,那将再次浪费我的时间。所以也许有一些技巧可以得到我的报告.. :( 【参考方案1】:

我不相信您的预期输出是正确的,因为 id 比确定订单发生顺序的日期更相关。如果您认为 ID 不重要,那么您就被塞满了,因为日期不足以(有重复)来确定事件的顺序,订单号也不是

   SELECT id, order_number, product_name, order_date, price,
            IFNULL((SELECT price 
                        FROM t 
                        WHERE id > od1.id
                        AND product_name = od1.product_name 
                        ORDER BY id asc, 
                        CAST(SUBSTRING(order_number, 7, 3) AS INT) DESC LIMIT 1), '-') LastPrice
FROM t od1
WHERE order_date <= '2019-09-30' 
ORDER BY od1.id desc, CAST(SUBSTRING(od1.order_number, 7, 3) AS INT) ASC

+------+--------------+--------------+------------+-------+-----------+
| id   | order_number | product_name | order_date | price | LastPrice |
+------+--------------+--------------+------------+-------+-----------+
|    4 | A0819-003    | Bottle       | 2019-08-30 | 30000 | -         |
|    3 | A0819-004    | Bottle       | 2019-08-30 | 40000 | 30000     |
|    2 | A0919-001    | Bottle       | 2019-09-29 | 10000 | 40000     |
|    1 | A0919-002    | Bottle       | 2019-09-29 | 20000 | 10000     |
+------+--------------+--------------+------------+-------+-----------+
4 rows in set (0.00 sec)

【讨论】:

谢谢。我刚刚发现了这种情况.. 这种情况可能.. 插入 1 行:5、'A0819-004'、'Bottle'、'2019-08-30'、'50000' 这就是为什么我不能相信 id .我只是依赖它的日期、编号和最早的数据输入

以上是关于我尝试获取一些按日期、编号排序的数据,并获取每件商品的最新价格的主要内容,如果未能解决你的问题,请参考以下文章

从按格式化日期排序的核心数据中获取

SQL 按日期排序并按用户获取结果

列表视图按日期分组 Dart

在Python中按日期对excel文件进​​行排序[关闭]

对表格进行数字排序并获取列表编号

如何从 XML 文件中按编号获取子节点