Подтвердить что ты не робот

Выберите информацию из таблицы, где строка имеет максимальную дату

Моя таблица выглядит примерно так:

group    date      cash  checks
  1    1/1/2013     0      0
  2    1/1/2013     0      800
  1    1/3/2013     0      700
  3    1/1/2013     0      600
  1    1/2/2013     0      400
  3    1/5/2013     0      200

- Не нужно наличных денег, просто демонстрируя, что в этой таблице больше информации.

Я хочу получить каждую уникальную группу, где date max, а чеки больше 0. Таким образом, возврат будет выглядеть примерно так:

group    date     checks
  2    1/1/2013    800
  1    1/3/2013    700
  3    1/5/2013    200

попытка:

SELECT group,MAX(date),checks
    FROM table
    WHERE checks>0
    GROUP BY group
    ORDER BY group DESC

проблема с этим, хотя он дает мне все даты и проверки, а не только максимальную строку даты.

с использованием ms sql server 2005

4b9b3361

Ответ 1

SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group

Это работает, чтобы получить максимальную дату. Вернитесь к своим данным, чтобы получить другие столбцы:

Select group,max_date,checks
from table t
inner join 
(SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group)a
on a.group = t.group and a.max_date = date

Внутренние функции соединения в качестве фильтра для получения максимальной записи.

FYI, ваши имена столбцов ужасны, не используйте зарезервированные слова для столбцов (группа, дата, таблица).

Ответ 2

Вы можете использовать окно MAX() следующим образом:

SELECT
  *, 
  max_date = MAX(date) OVER (PARTITION BY group)
FROM table

чтобы получить максимальные даты на group вместе с другими данными:

group  date      cash  checks  max_date
-----  --------  ----  ------  --------
1      1/1/2013  0     0       1/3/2013
2      1/1/2013  0     800     1/1/2013
1      1/3/2013  0     700     1/3/2013
3      1/1/2013  0     600     1/5/2013
1      1/2/2013  0     400     1/3/2013
3      1/5/2013  0     200     1/5/2013

Используя вышеприведенный вывод как производную таблицу, вы можете получить только строки, где date соответствует max_date:

SELECT
  group,
  date,
  checks
FROM (
  SELECT
    *, 
    max_date = MAX(date) OVER (PARTITION BY group)
  FROM table
) AS s
WHERE date = max_date
;

чтобы получить желаемый результат.

В принципе, это похоже на @Twelfth suggestion, но позволяет избежать соединения и, следовательно, может быть более эффективным.

Вы можете попробовать метод в SQL Fiddle.

Ответ 3

вы можете использовать join, как это. Если вы используете IN, это приведет к медленной попытке избежать этого.

    SELECT *  FROM (SELECT  msisdn, callid, Change_color, play_file_name, date_played FROM insert_log
   WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
 ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played