2

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

从表 1 中选择名称、日期、值;

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 存储过程中做到这一点?

问候

4

3 回答 3

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 小提琴演示

导致:

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

编辑:要获得汇总组总计,您必须介绍用户定义变量的使用。这是一个例子:

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

于 2013-03-16T02:26:04.317 回答
1

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

/* SELECT ... */ ORDER BY sort_column DESC LIMIT 1
于 2013-03-16T02:06:34.400 回答
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
于 2013-03-16T02:08:01.840 回答