Java 在平均结果之前,限制每组的记录
我有一个具有以下结构的表:Java 在平均结果之前,限制每组的记录,java,mysql,Java,Mysql,我有一个具有以下结构的表: doc_date date, doc_type varchar, code int primary key, qty int, price double 代码范围为1-10;单据类型包括LP、FP、CAS、CRS 我想查询该表,以获取文档类型为“LP”或“FP”的每个代码的文档日期N记录数的最新降序,然后是平均价格 我已经能够做我所需要的一切,除了在平均价格之前限制每个代码的记录 我的问题是: SELECT a.sfcode, a.productname, COA
doc_date date, doc_type varchar, code int primary key, qty int, price double
代码范围为1-10;单据类型包括LP、FP、CAS、CRS
我想查询该表,以获取文档类型为“LP”或“FP”的每个代码的文档日期N记录数的最新降序,然后是平均价格
我已经能够做我所需要的一切,除了在平均价格之前限制每个代码的记录
我的问题是:
SELECT a.sfcode, a.productname, COALESCE((b.QTY - COALESCE(c.QTY,0)),0) AS currentstock, a.lastprice AS lprice, COALESCE(CAST(d.price AS decimal(16,3)),0) AS sprice, COALESCE(CAST(e.price AS decimal(16,3)),0) AS cprice FROM
(SELECT sfcode, productname, lastprice FROM products) AS a LEFT JOIN
(SELECT sfcode, SUM(COALESCE(QTY, 0)) AS QTY FROM transactions WHERE doctype IN ('FP','LP','CSR') GROUP BY sfcode) AS b ON a.sfcode = b.sfcode LEFT JOIN
(SELECT sfcode, SUM(QTY) AS QTY FROM transactions WHERE doctype IN ('FPR','LPR','CAS','CRS') GROUP BY sfcode) AS c ON a.sfcode = c.sfcode LEFT JOIN
(SELECT sfcode, AVG(unitprice) AS price FROM transactions WHERE doctype IN ('CAS', 'CRS') GROUP BY sfcode) AS d ON a.sfcode = d.sfcode LEFT JOIN
(SELECT sfcode, AVG(unitprice) AS price FROM transactions WHERE doctype IN ('FP', 'LP') GROUP BY sfcode) AS e ON a.sfcode = e.sfcode ORDER BY sfcode;
查询的最后两行是我需要在平均价格之前按日期降序限制记录的地方
我已经搜索过了,找到了可以获取有限行的地方,但我不知道如何添加doc_type子句并根据desc date获取结果
链接到sqlfiddle
我希望结果是这样的。。当限制设置为3时:
| sfcode | stock | lprice | sprice | cprice |
| 1 | 40 | 15.000 | 0.000 | 9.667 |
| 2 | 80 | 25.000 | 0.000 | 19.667 |
| 3 | 120 | 35.000 | 0.000 | 29.66 |
| 4 | 160 | 45.000 | 0.000 | 39.667 |
| 5 | 200 | 55.000 | 0.000 | 49.667 |
| 6 | 0 | 65.000 | 0.000 | 0.000 |
| 7 | 0 | 75.000 | 0.000 | 0.000 |
| 8 | 0 | 85.000 | 0.000 | 0.000 |
| 9 | 0 | 95.000 | 0.000 | 0.000 |
| 10 | 0 |105.000 | 0.000 | 0.000 |
因此,根据您提供的,您可以将查询更改为
set @row_limit = 3;
set @row_num = 0;
set @code = -1;
SELECT a.sfcode, COALESCE((b.QTY - COALESCE(c.QTY,0)),0) AS currentstock,
a.lastprice AS lprice, COALESCE(CAST(d.price AS decimal(16,3)),0) AS sprice,
COALESCE(CAST(e.price AS decimal(16,3)),0) AS cprice FROM
(SELECT sfcode, lastprice FROM products) AS a LEFT JOIN
(SELECT sfcode, SUM(COALESCE(QTY, 0)) AS QTY
FROM transactions
WHERE doctype IN ('FP','LP','CSR')
GROUP BY sfcode) AS b ON a.sfcode = b.sfcode LEFT JOIN
(SELECT sfcode, SUM(QTY) AS QTY
FROM transactions
WHERE doctype IN ('FPR','LPR','CAS','CRS')
GROUP BY sfcode) AS c ON a.sfcode = c.sfcode LEFT JOIN
(SELECT sfcode, AVG(unitprice) AS price
FROM (SELECT sfcode, unitprice,
@row_num := if(@code = sfcode, @row_num + 1, 0) AS rowNumber,
@code := sfcode AS code
FROM transactions
WHERE doctype IN ('CAS', 'CRS')
ORDER BY sfcode, docdate DESC) AS f
WHERE f.rowNumber < @row_limit GROUP BY sfcode)
AS d ON a.sfcode = d.sfcode
LEFT JOIN (SELECT sfcode, AVG(unitprice) AS price
FROM **(SELECT sfcode, unitprice,
@row_num := if(@code = sfcode, @row_num + 1, 0) as rowNumber,
@code := sfcode AS code
FROM transactions
WHERE doctype IN ('FP', 'LP')
ORDER BY sfcode, docdate DESC) AS g**
WHERE g.rowNumber < @row_limit GROUP BY sfcode)
AS e ON a.sfcode = e.sfcode ORDER BY sfcode;
其中@row\u limit被设置为您希望收集的最新事务的数量。您可以发布一个SQLFIDLE,其中包含架构和数据,以便我们进行测试。我们对此无能为力,因为你想要什么限制?像一定数量的唱片?那会是多少?你的预期结果是什么?我的意思是你能发布你想要的结果吗?所以我真的不明白。。您在sql FIDLE中的结果正是您发布的预期结果。。我可以限制数据,但我不知道它会有什么好处,因为你已经得到了正确的结果。工作就像一个魅力!非常感谢你。