Как получить последнее значение в нескольких строках в mysql?

71
9

Как выбрать последнее значение в нескольких строках в 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?

С уважением

спросил(а) 2013-03-16T05:03:00+04:00 7 лет, 7 месяцев назад
1
Решение
57

Это кажется более подходящим для вашего уровня презентации, но его можно написать с помощью 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

В результате чего:

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

EDIT: Чтобы получить 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

ответил(а) 2013-03-16T05:26:00+04:00 7 лет, 7 месяцев назад
57

Там нет "последней" записи. Вам нужно отсортировать их по столбцу, которому они должны быть упорядочены, а затем выбрать только последнюю строку.

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

ответил(а) 2013-03-16T05:06:00+04:00 7 лет, 7 месяцев назад
41

Вы можете выбрать значение 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-16T05:08:00+04:00 7 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема