Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 表现最为出色;尽管糟糕得令人震惊。我决定重构以减少查询时间。我已经把它作为一个编辑记录在了原始的帖子上。它确实有效。谢谢你,但在我接受这一点之前,我想知道这里是否有可以优化的地方。当我运行我的SELECT AC_ID、ASAT、SUM(VAL)FROM P_Mysql_Sql_Group By_Max - Fatal编程技术网

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