Hello Eery我是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
我想只记录一下。 即每天只有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'
。我甚至尝试过这种方式..同样的错误最后一条记录没有来......
答案 0 :(得分:0)
以下步骤应该产生您追求的结果
SQL语句(编辑)
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。
答案 1 :(得分: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
)
答案 2 :(得分:-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&gt; = '02 .02.2010'和 c3&lt; = '24 .02.2010'。它工作正常。但我发布的查询无法根据日期正确过滤记录。
我想知道我哪里出错了以增强我的知识而不仅仅是复制你的查询: - )