【问题标题】:Nested SQL Server Query Max Date嵌套 SQL Server 查询最大日期
【发布时间】:2013-01-16 02:19:25
【问题描述】:

女士们,先生们,

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

视图看起来像这样:

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。因此,在上面的示例中,我将获得类别 a 的 1 行,其中包含最新的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 

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

再次感谢

【问题讨论】:

  • 所以您的标题中有 SQL Server,并且有 一个 plsql 标签。会是什么?

标签: sql sql-server tsql


【解决方案1】:

在 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(),它不会创建重复的数字。所以这里不适用。有关差异的更多信息,请参阅this question。

【讨论】:

    【解决方案2】:

    如果你想这样做到最近的日期,你需要先转换为日期。在 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()。

    【讨论】:

      【解决方案3】:

      您的查询已关闭,您在 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 
      

      【讨论】:

      • 啊,谢谢,maxuploadate 上的分组是问题所在。谢谢兄弟。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多