如何在mysql中获取多行的最后一个值?

时间:2013-03-16 02:03:33

标签: mysql stored-procedures

如何选择MySQL中多行的最后一个值?

从table1中选择名称,日期,值;

Name    Date               Value
A       01-Jan-2013         3
A       02-Jan-2013         4
B       04-Jan-2013         2
B       05-Jan-2013         8

我需要的结果:

Name    Date               Value
A       01-Jan-2013         3
A       02-Jan-2013         4
        Last_value          4
B       04-Jan-2013         2
B       05-Jan-2013         8
        Last_value          8

如何在MySQL存储过程中执行此操作?

此致

3 个答案:

答案 0 :(得分:1)

没有“最后”记录。您需要按顺序对它们进行排序,然后只选择最后一行。

/* SELECT ... */ ORDER BY sort_column DESC LIMIT 1

答案 1 :(得分:1)

这似乎更适合您的表示层,但可以使用SQL编写它。这样的事情应该使用UNION ALL来返回每组的最后一条记录:

SELECT Name, Dt, Value
FROM (
    SELECT Name, Dt, Value, Name Name2
    FROM YourTable 
    UNION ALL
    SELECT '' Name, 'Last_Value', T.Value, T.Name Name2
    FROM YourTable T
       JOIN (
         SELECT Name, MAX(dt) MaxDt
         FROM YourTable
         GROUP BY Name
       ) T2 ON T.Name = T2.Name AND T.dt = T2.MaxDt
    ORDER BY Name2, Dt, Value
  ) t

SQL Fiddle Demo

导致:

NAME         DT                      VALUE
A            2013-01-01 00:00:00     3
A            2013-01-02 00:00:00     4
             Last_Value              4
B            2013-01-04 00:00:00     2
B            2013-01-05 00:00:00     8
             Last_Value              8

编辑:要获得Summed Group Total,您必须引入用户定义变量的使用。这是一个例子:

SELECT Name, Dt, IF(Name='',summedTotal,Value) Value
FROM (
  SELECT @summedTotal:=IF(@prevRow=Name,@summedTotal+Value,Value) summedTotal,
    Name, Dt, Value, Name Name2,
    @prevRow:=Name
  FROM YourTable
    JOIN (SELECT @summedTotal:=0) t
  UNION ALL
  SELECT summedTotal, '' Name, 'Last_Value', T.Value, T.Name Name2, pr
  FROM (
      SELECT @summedTotal:=IF(@prevRow=Name,@summedTotal+Value,Value) summedTotal,
        Name, Dt, Value, Name Name2,
        @prevRow:=Name pr
      FROM YourTable
        JOIN (SELECT @summedTotal:=0) t
    ) T
    JOIN (
      SELECT Name, MAX(dt) MaxDt
      FROM YourTable
      GROUP BY Name
    ) T2 ON T.Name = T2.Name AND T.dt = T2.MaxDt
  ORDER BY Name2, Dt, Value
  ) t

更多SQL Fiddle

答案 2 :(得分:0)

您可以使用内部连接选择MAX值。但是您尚未指定主键列。

SELECT
  m.*
FROM mytable AS m
  INNER JOIN (SELECT
        MAX(primary_key_column)
          FROM mytable
          GROUP BY Name) AS l
    ON l.primary_key_column = m.primary_key_column