选择一个不同的记录,过滤不起作用

时间:2010-05-05 07:04:07

标签: sql-server

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'。我甚至尝试过这种方式..同样的错误最后一条记录没有来......

3 个答案:

答案 0 :(得分:0)

以下步骤应该产生您追求的结果

  • 每天查找最大值c3。
  • 将结果与原始表结合,仅包含最大c1值。

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'。它工作正常。但我发布的查询无法根据日期正确过滤记录。

我想知道我哪里出错了以增强我的知识而不仅仅是复制你的查询: - )