我有一个表具有以下模式
Item:Varchar
Date:Date
Quantity:Float
trasactionid:int
样本数据:
项目 | 日期 | 数量 | 事务类 |
---|---|---|---|
第一部分 | 2023年1月1日 | 10个 | 三 |
第一部分 | 2023年1月1日 | 十五岁 | 五 |
第一部分 | 2023年1月1日 | 十七岁 | 二 |
第一部分 | 2023年1月1日 | 十三 | 六 |
第一部分 | 2019 -01- 02 | 十三 | 七 |
第一部分 | 2019 -01- 02 | 1 | 八 |
第一部分 | 2019 -01- 02 | 二十二 | 10个 |
第一部分 | 2019 -01- 02 | 五 | 十二岁 |
我需要按交易ID对数据进行排序,然后从一个组的第一行找到唯一的部件、日期和数量作为期初余额,从最后一行找到唯一的部件、日期和数量作为期末余额。
必填输出
项目 | 日期 | 事务类 | 期初余额 | 事务类 | 关闭余额 |
---|---|---|---|---|---|
第一部分 | 2023年1月1日 | 二 | 十七岁 | 六 | 十三 |
第一部分 | 2019 -01- 02 | 七 | 十三 | 十二岁 | 五 |
我尝试使用窗口函数first_value和last value,但无法实现结果
5条答案
按热度按时间pprl5pva1#
https://dbfiddle.uk/QQlpAnJt
vnjpjtjt2#
从版本5.5开始,这是一个适用于任何
mysql
版本的工作解决方案:Demo here
vof42yt13#
使用
first_value
和last value
窗口函数,尝试以下操作:demo
mf98qq944#
你可以像这样使用窗口函数:
该子查询分别使用
max()
和first_value()
计算最后一次每日交易的日期和数量。它还使用row_number()
标识与第一个事务对应的行。然后,外部查询只过滤每个组的顶部记录,它已经包含了我们需要的信息。这种方法的优点是它避免了聚合和自连接(在大多数情况下效率较低),并且它具有尽可能少的窗口函数调用。
mrphzbgm5#
我不确定mySql语法,但许多SQL引擎支持
WITH
语法,我认为这将是非常容易为您翻译。这是解决您的问题的一种方法:如果不支持
WITH
语法,可以使用FROM (SELECT ...)
语法希望有帮助