@nsf4

Как построить sql-запрос с выводом актуальных данных по дням?

Есть таблица
id | name | val | date
Примеры данных
1 | Лена | 45 | 2015-07-01
2 | Женя | 50 | 2015-07-01
3 | Саша | 45 | 2015-07-01
4 | Лена | 30 | 2015-07-02

Нужно выбрать name и val актуальные (за текущий день) если нет данных за текущий день, то за предыдущий.
То есть:
Женя | 50
Саша | 45
Лена | 30

Никак не могу справиться с запросом, работает такой
SELECT name, val FROM table GROUP BY name;
Но только когда записи идут последовательно (сначала свежие, потом старые)
Удивительно, но ORDER BY date DESC не помогает.
  • Вопрос задан
  • 753 просмотра
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Пардон, в первый раз не внимательно вопрос прочитал.

select
  tmp.name,
  test.val
from
  ( 
    select 
      name, 
      max(date) as max_date
    from test
    group by name
  ) as tmp
join test on test.name=tmp.name and test.date=tmp.max_date

Обязательно наличие индекса по name и date
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `t1`.`name`, `t1`.`val`, `t1`.`date`
    FROM `table` AS `t1`
    JOIN (
        SELECT `name`, MAX(`date`) AS `date`
            FROM `table`
            GROUP BY `name`
    ) AS `t2` ON `t2`.`name` = `t1`.`name` AND `t2`.`date` = `t1`.`date`

sqlfiddle.com/#!9/be1a2/2
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dude_sam
@dude_sam
BI Developer
CREATE TABLE #vals
([id] INT PRIMARY KEY IDENTITY(1,1)
,[name] NVARCHAR(100)
,[val] SMALLINT
,[date] DATE
);
CREATE NONCLUSTERED INDEX [IX_vals_date] ON #vals([date]);

INSERT INTO #vals([name],[val],[date])
VALUES (N'Лена', 45, '2015-07-01'),
       (N'Женя', 50, '2015-07-01'),
       (N'Саша', 45, '2015-07-01'),
       (N'Лена', 30, '2015-07-02');

WITH vdo AS
(
SELECT v.[id], v.[name], v.[val]
      ,v.[date]
      ,ROW_NUMBER() OVER(PARTITION BY v.[name]
                         ORDER BY v.[date] DESC
                        ) AS [date_order]
FROM #vals v
)
SELECT vdo.[id], vdo.[name], vdo.[val]
FROM vdo
WHERE vdo.[date_order] = 1;

DROP TABLE #vals;


upd: Упс, только заметил тег mysql и я так понимаю там нет поддержки ни cte, ни windowsfunction?
ну, тогда через подзапрос:

CREATE UNIQUE INDEX [IX_vals_name_date] ON #vals([name],[date]);

SELECT v.[id], v.[name], v.[val]
FROM #vals v
INNER JOIN (
            SELECT v.[name], MAX(v.[date]) AS [date_last]
            FROM #vals v
            GROUP BY v.[name]
           ) vdo 
           ON v.[name] = vdo.[name] AND v.[date] = vdo.[date_last];
Ответ написан
Комментировать
Therapyx
@Therapyx
Data Science
Попробуй примерно так SELECT name, val FROM table where convert([ТвоеНазваниеДейта], 102)
= convert(getdate(), 102)
А дальше уже там group by, order by... =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы