Mysql 表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。我已经把它作为一个编辑记录在了原始的帖子上。它确实有效。谢谢你,但在我接受这一点之前,我想知道这里是否有可以优化的地方。当我运行我的SELECT AC_ID、ASAT、SUM(VAL)FROM P
Mysql 表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。我已经把它作为一个编辑记录在了原始的帖子上。它确实有效。谢谢你,但在我接受这一点之前,我想知道这里是否有可以优化的地方。当我运行我的SELECT AC_ID、ASAT、SUM(VAL)FROM P,mysql,sql,group-by,max,Mysql,Sql,Group By,Max,表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。我已经把它作为一个编辑记录在了原始的帖子上。它确实有效。谢谢你,但在我接受这一点之前,我想知道这里是否有可以优化的地方。当我运行我的SELECT AC_ID、ASAT、SUM(VAL)FROM POSITION GROUP BY AC_ID、ASAT ORDER BY ASAT DESC时,需要0.117s才能在一个300k行的表上执行。新的SQL为我提供了正确的答案,但针对同一组数据需要5分钟以上的时间才能完成。我有一个关于ac_id
表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。我已经把它作为一个编辑记录在了原始的帖子上。它确实有效。谢谢你,但在我接受这一点之前,我想知道这里是否有可以优化的地方。当我运行我的SELECT AC_ID、ASAT、SUM(VAL)FROM POSITION GROUP BY AC_ID、ASAT ORDER BY ASAT DESC时,需要0.117s才能在一个300k行的表上执行。新的SQL为我提供了正确的答案,但针对同一组数据需要5分钟以上的时间才能完成。我有一个关于ac_id,pos_id,asat的索引。不知道是否需要2次完整表扫描。可能还有其他一些索引可以更好地优化,但您的业务规则的性质将需要多次表扫描。如果这是另一个RDBMS,您可能会从窗口函数中获得更好的性能,但MySQL中没有这些函数。你也可以尝试一些使用变量的技巧(这是很多人在MySQL中模拟窗口函数的方式),但我现在没有可用的服务器来测试,也没有任何东西会想到这一点。两个答案都是正确的。这一次表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。将其记录为原始帖子上的编辑。
AC_ID | POS_ID | ASAT | VAL
1 | 1 | 2016-01-01 | 100
1 | 2 | 2016-01-01 | 200
AC_ID | POS_ID | ASAT | VAL
1 | 1 | 2016-01-01 | 100
1 | 2 | 2016-01-01 | 200
1 | 2 | 2016-01-02 | 250
AC_ID | POS_ID | ASAT | VAL
1 | 1 | 2016-01-01 | 100
1 | 2 | 2016-01-01 | 200
1 | 2 | 2016-01-02 | 250
1 | 1 | 2016-01-03 | 0
SELECT SUM(VAL) FROM POSITION P1
WHERE P1.ASAT =
(SELECT MAX(P2.ASAT) FROM POSITION P2
WHERE P1.AC_ID = P2.AC_ID
AND P1.POS_ID = P2.POS_ID
AND P2.DATE <= [CHOSEN DATE])
SELECT AC_ID, ASAT, SUM(VAL) FROM POSITION
GROUP BY AC_ID, ASAT
ORDER BY ASAT DESC
AC_ID | ASAT | SUM(VAL)
1 | 2016-01-01 | 300
1 | 2016-01-02 | 350
1 | 2016-01-03 | 250
AC_ID | POS_ID | ASAT | VAL
1 | 1 | 2016-01-01 | 100
1 | 2 | 2016-01-01 | 200
1 | 2 | 2016-01-02 | 250
1 | 1 | 2016-01-03 | 0
2 | 1 | 2016-01-02 | 500
3 | 7 | 2016-01-02 | 1000
3 | 7 | 2016-01-03 | 1000
3 | 12 | 2016-01-03 | 5000
2 | 1 | 2016-01-04 | 750
AC_ID | ASAT | SUM(VAL)
1 | 2016-01-01 | 300
1 | 2016-01-02 | 350
1 | 2016-01-03 | 250
2 | 2016-01-02 | 500
2 | 2016-01-04 | 750
3 | 2016-01-02 | 1000
3 | 2016-01-03 | 6000
AC_ID | POS_ID | ASAT | END_DATE | VAL
1 | 1 | 2016-01-01 | 2016-01-03 | 100
1 | 2 | 2016-01-01 | 2016-01-02 | 200
1 | 2 | 2016-01-02 | 9999-12-31 | 250
1 | 1 | 2016-01-03 | 9999-12-31 | 0
2 | 1 | 2016-01-02 | 2016-01-04 | 500
3 | 7 | 2016-01-02 | 2016-01-03 | 1000
3 | 7 | 2016-01-03 | 9999-12-31 | 1000
3 | 12 | 2016-01-03 | 9999-12-31 | 5000
2 | 1 | 2016-01-04 | 9999-12-31 | 750
SELECT
p1.AC_ID,
p1.ASAT,
SUM(p2.VAL) as totalValue
FROM
(SELECT DISTINCT AC_ID, ASAT FROM position) p1
INNER JOIN position p2 ON
p2.AC_ID = p1.AC_ID AND
p2.ASAT <= p1.ASAT AND
p2.END_DATE > p1.END_DATE
GROUP BY
p1.AC_ID,
p1.ASAT;
SELECT aa.AC_ID, aa.ASAT, SUM(p.VAL)
FROM (SELECT DISTINCT AC_ID, ASAT FROM POSITION
) aa JOIN
POSITION P
ON p.AC_ID = aa.AC_ID and p.ASAT <= aa.ASAT
WHERE P.ASAT = (SELECT MAX(P2.ASAT)
FROM POSITION P2
WHERE P.AC_ID = P2.AC_ID AND
P.POS_ID = P2.POS_ID AND
P2.ASAT <= aa.ASAT
)
GROUP BY aa.AC_ID, aa.ASAT;
SELECT
P1.ac_id,
P1.asat,
SUM(P2.val) AS total_value
FROM
(SELECT DISTINCT P.ac_id, P.asat FROM dbo.Position P) P1
INNER JOIN dbo.Position P2 ON
P2.ac_id = P1.ac_id AND
P2.asat <= P1.asat
LEFT OUTER JOIN dbo.Position P3 ON
P3.ac_id = P1.ac_id AND
P3.pos_id = P2.pos_id AND
P3.asat > P2.asat AND
P3.asat <= P1.asat
WHERE
P3.ac_id IS NULL
GROUP BY
P1.ac_id,
P1.asat