2013-07-03 4 views
1

Я не большой парень SQL, поэтому я надеюсь, что этот вопрос не слишком глуп, но пока я не нашел ответа.Получите последнее время на каждый день?

У меня есть таблица, которая выглядит примерно так:

LastUpdate      | TheValue 
------------------------------------------------- 
2013-06-25 06:44:18.530   | 1 
2013-06-25 06:59:18.500   | 7 
2013-06-25 12:51:18.530   | 3 
2013-06-26 07:44:18.530   | 5 
2013-06-26 09:44:18.530   | 9 
2013-06-28 08:44:18.530   | 0 
2013-06-28 11:44:18.530   | 1 

В результате я хочу последнюю запись каждого дня со значением:

LastUpdate      | TheValue 
------------------------------------------------- 
2013-06-25 12:51:18.530   | 3 
2013-06-26 09:44:18.530   | 9 
2013-06-28 11:44:18.530   | 1 

Любой совет?

ответ

2

Попробуйте

WITH TEMP as 
(
    SELECT MAX(LastUpdate) as TempLastUpdate 
    FROM yourTable Group by CONVERT(VARCHAR(10),LastUpdate,111) 
) 

SELECT LastUpdate,TheValue from yourTable WHERE LastUpdate IN (SELECT TempLastUpdate FROM Temp) 

RESU л

LastUpdate      | TheValue 
------------------------------------------------- 
2013-06-25 12:51:18.530   | 3 
2013-06-26 09:44:18.530   | 9 
2013-06-28 11:44:18.530   | 1 

Объяснение: -

1.We первая группа по дате только без времени

2.We принимают максимум соответствующих групп, так что вы получите последнюю версию одного дня

Надеюсь, это поможет

+1

К сожалению, мой пример не был лучшим. Последнее значение дня не обязательно является самым высоким. – Feroc

+0

Мы делаем день за группой, но, получив последнее значение, мы рассмотрим всю ценность, которая должна была быть выше. Посмотрите мое редактирование – Raghurocks

+0

Aaaah ... Я вижу, спасибо. – Feroc

4

Запрос:

SELECT t1.* 
FROM Table1 t1 
WHERE t1.LastUpdate = (SELECT MAX(t2.LastUpdate) 
         FROM Table1 t2 
         WHERE CAST(t1.LastUpdate AS DATE) = 
          CAST(t2.LastUpdate AS DATE)) 

ИЛИ:

SELECT a.* 
FROM(SELECT t1.*, 
    ROW_NUMBER() OVER(PARTITION BY CAST(t1.LastUpdate AS DATE) ORDER BY t1.LastUpdate DESC) tt 
    FROM Table1 t1)a 
WHERE a.tt = 1 

Результат:

|     LASTUPDATE | THEVALUE | 
------------------------------------------ 
| June, 25 2013 12:51:18+0000 |  3 | 
| June, 26 2013 09:44:18+0000 |  9 | 
| June, 28 2013 11:44:18+0000 |  1 | 
+0

Спасибо, что хорошо выглядит. Я проведу его с моей реальной таблицей. – Feroc

+0

Очень дорогой запрос. **:) ** – Luv

+0

@Luv Я думаю, что лучшего решения не было бы, сравнивая планы выполнения ... Возможно, с номером строки над разделом Date .. но опять же я всегда стараюсь сравнить планы выполнения и обычно эти запросы с подзапросом где предложение равно другим лучшим решениям. Это просто мой ответ, я думаю, что лучше получить более разные ответы и выбрать лучшее. – Justin

Смежные вопросы