0

女士们先生们,

我需要编写一个从视图中获取数据的查询,但我不知道该怎么做。问题是实际上没有键,我关心的两个字段将控制我需要检索的行。

视图看起来像这样:

Category   columna   columnb   uploaddate 
-----------------------------------------------------
   a        value     value    1/30/2013 04:04:04:000 
   a        value     value    1/29/2013 04:04:04:000 
   b        value     value    1/28/2013 01:23:04:000 
   b        value     value    1/30/2013 04:04:04:000 
   b        value     value    1/30/2013 04:04:04:000 
   c        value     value    1/30/2013 01:01:01:000 
   c        value     value    1/30/2013 01:01:01:000 

我需要检索的是每个唯一类别和最新的所有行uploaddate。所以在上面的例子中,我会得到 1 行的类别 a ,它有最新的uploaddate. 类别 b 将有 2 行日期为 2013 年 1 月 30 日。类别 c 也将有两行。

我还需要比较上传日期,而不是时间。因为加载可能需要几秒钟。我试图使用最大日期,但它只会抓住时间到第二个。

任何指导/想法都会很棒。

谢谢!

编辑:

这是我到目前为止汇总的内容,我认为它已经接近但它还没有工作,我怀疑这是最有效的方法。

select 
    * 
from 
    VIEW c 
    INNER JOIN 
    ( 
        SELECT 
            Category, 
            MAX(CONVERT(DateTime, Convert(VarChar, UploadDate, 101))) as maxuploaddate  
        FROM 
            View 
        GROUP BY 
            Category, 
            UploadDate 
    ) temp ON temp.Category = c.Category AND CONVERT(VarChar, UploadDate, 101) = temp.maxuploaddate 

问题在于嵌套的选定语句,因为它仍在获取类别和上传日期的所有组合。有没有办法在 Category 和 UploadDate 上做一个区分,只是得到最新的组合?

再次感谢

4

3 回答 3

1

如果要执行此操作到最近的日期,则需要先转换为日期。在 SQL Server 语法中:

select *
from (select category, columna, columnb, uploaddate,
             rank() over ( partition by category order by cast(uploaddate as date) desc) as seqnum
      from view
     ) v
where seqnum = 1

在 Oracle 语法中:

select *
from (select category, columna, columnb, uploaddate,
             rank() over ( partition by category order by to_char(uploaddate, 'YYYY-MM-DD') desc) as seqnum
      from view
     ) v
where seqnum = 1

因为你想要领带,所以这些使用rank()而不是row_number().

于 2013-01-31T21:22:14.500 回答
1

您的查询已关闭,您在 group by 中有错误。我也会摆脱日期转换;日期比较工作正常。

select 
    * 
from 
    VIEW c 
    INNER JOIN 
    ( 
        SELECT 
            Category, 
            MAX(UploadDate) as maxuploaddate  
        FROM 
            View 
        GROUP BY 
            Category
    ) temp ON temp.Category = c.Category AND UploadDate = temp.maxuploaddate 
于 2013-02-01T14:09:26.773 回答
0

在 Oracle 中您可以使用它Rank()来实现这一点。Rank()如果满足相同的条件,则会创建一个重复的号码。

编辑:您可以使用Trunc()从上传日期“修剪”时间。

select *
from (select category, columna, columnb, uploaddate,
      rank() over ( partition by category order by trunc(uploaddate) desc) rank
      from view)
where rank = 1

Dense_Rank()存在,不会产生重复的数字。所以这里不适用。有关差异的更多信息,请参阅此问题

于 2013-01-31T21:17:06.697 回答