2010-05-05 2 views
1

Здравствуйте, EVery Я новичок в SQl. чтобы получить следующие записи.Выберите отдельную запись, фильтрация не работает

У меня есть таблица с записями в

c1 c2   c3     c4 c5 c6 

1 John   2.3.2010 12:09:54  4  7 99   
2 mike   2.3.2010 13:09:59  8  6 88 
3 ahmad   2.3.2010 13:09:59  1  9 19 


4 Jim  23.3.2010 16:35:14  4  5 99 
5 run  23.3.2010 12:09:54  3  8 12 

Я хочу fecth только записи. i.e всего 1 последняя запись в день. Если оба они происходят в то же время, сортировать по C1.so в 1 & 3 он должен принести 3.

3 ahmad   2.3.2010 14:09:59  1  9 19 
4 Jim  23.3.2010 16:35:14  4  5 99 

У меня новая проблема в этом. Если я фильтрую записи, основываясь на условиях отсутствия последней записи. Я пробовал много способов, но все же он терпит неудачу. Здесь update_log - моя таблица.

SELECT * FROM update_log t1 
WHERE (t1.c3) = 
(
    SELECT MAX(t2.c3) 
    FROM update_log t2 
    WHERE DATEDIFF(dd,t2.c3, t1.c3) = 0 
) 
and t1.c3 > '02.03.2010' and t1.modified_at <= '22.03.2010' 

ORDER BY t1.c3 ASC. Но я не в состоянии восстановить запись

4 Jim  23.3.2010 16:35:14  4  5 99 

Я не знаю, что это результаты запроса только в

3 ahmad   2.3.2010 14:09:59  1  9 19 

Формат c3 столбца является DateTime. Я перекачиваю данные в колонку как с использованием $date = date("d.m.Y H:i",time()); - простой выбор даты сегодня.

Другой запрос, который я пробовал для этой же цели.

select * from (select convert(varchar(10), c3,104) as date, max(c3) as max_date, max(c1) as Nr from update_log group by convert(varchar(10), c3,104)) as t2 inner join update_log as t1 on (t2.max_date = t1.c3 and convert(varchar(10), c3,104) = date and t1.[c1]= Nr) WHERE t1.c3 >= '02.03.2010' and t1.c3 <= '16.04.2010'. Я даже попробовал эту way..the ту же ошибку последняя запись не приходит ..

+0

Где находится столбец Modified_at в вашей таблице? – codingbadger

ответ

-1

ОК, теперь я понял. на самом деле я написал запрос для этой же цели таким образом.

select * from #temp 
select * from 
(select max(c1) as nr from 
(select convert(varchar(10), c3,104) as date, max(c3) as max_date 
from #temp where 
convert(varchar(10),c3,104) >= '02.02.2010' and 
convert(varchar(10),c3,104) <= '23.02.2010' 
group by convert(varchar(10), c3,104)) 
as t2 inner join #temp as t1 on (t2.max_date = t1.c3 and 
convert(varchar(10), c3,104) = date) 
group by convert(varchar(10),max_date,104)) 
as t3 inner join #temp as t4 on (t3.nr = t4.c1) 

Если я сменил эти две строки на c3> = '02 .02.2010 'и c3 < = '24 .02.2010'. Он работает нормально. но запрос, который я опубликовал, не может правильно фильтровать записи на основе дат.

Я хочу знать, где я пошел неправильно улучшить мой knoweldge, а не просто скопировать ур запрос :-)

+0

-1 «Редактируйте свой вопрос для таких вещей. Поскольку это не ответ на ваш вопрос, не вносите его с ответами!» –

+0

@help_inmssql - Поскольку c3 имеет дату ** и ** время, * c3 <= convert (varchar (10), '23.03.2010', 104) * похоже на запрос компьютера, если 9.3413 <= 9.0000. –

0

Следующие шаги должны производить результаты вы после

  • найти Макс с3 на каждый день.
  • Присоедините результаты к исходной таблице, указав только максимальные значения c1.

SQL Statement (Edited)

DECLARE @update_log TABLE (c1 INTEGER, c3 DATETIME) 

INSERT INTO @update_log 
SELECT 1, '3.2.2010 12:09:54' 
UNION ALL SELECT 2, '3.2.2010 13:09:59' 
UNION ALL SELECT 3, '3.2.2010 13:09:59' 
UNION ALL SELECT 4, '3.23.2010 16:35:14' 
UNION ALL SELECT 5, '3.23.2010 12:09:54' 

SELECT c1 = MAX(l.c1), l.c3 
FROM @update_log l 
     INNER JOIN (
      SELECT c3_max = MAX(c3)  
      FROM @update_log 
      WHERE c3 > '3.2.2010 00:00:00' 
        AND c3 < '3.24.2010 00:00:00' 
      GROUP BY 
        CONVERT(VARCHAR(10), c3, 101) 
     ) l_maxdate ON l_maxdate.c3_max = l.c3 
GROUP BY 
     l.c3 

Примечания

Вы должны прочитать FAQ о том, как работает этот сайт. Как уже упоминалось, Stack Overflow не предназначен для использования, как если бы вы использовали программу чтения новостей, где задавали последующие вопросы после ответа, создавая новый ответ.

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

Это, как известно, наслаждаться SO.

+0

@help_inmssql - я изменил запрос. Не могли бы вы проверить результаты. –

0

Предполагая, что c1 является уникальным, мы надеемся, даже первичный ключ. Это также предполагает использование SQL Server 2008 для типа данных DATE.

SELECT t1.* 
FROM update_log t1 
WHERE t1.c3 > '02.03.2010' 
    AND t1.modified_at <= '22.03.2010' 
    AND t1.c1 IN 
    (SELECT TOP 1 c1 
     FROM update_log t2 
     WHERE CAST(t1.c3 As DATE) = CAST(t2.c3 As DATE) 
     ORDER BY c3 DESC, c1 DESC 
    ) 
Смежные вопросы