首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大日期的SQL查询

最大日期的SQL查询
EN

Stack Overflow用户
提问于 2011-03-13 20:27:37
回答 4查看 539关注 0票数 2

我问了a related question和我得到了一些非常好的答案,但我试图在不做临时表的情况下进行查询。我相信这是可以做到的,但我想不出怎么做。

我有两个表,我想得到每个条目的最新状态,其中状态日期小于或等于输入日期。

条目表(条目):

代码语言:javascript
复制
  UserID   | EntryDate  
 ----------------------
    1      |  5/4/2010  
    1      |  4/4/2010  
    1      |  3/4/2010  
    1      |  2/4/2010  
    2      |  5/4/2010
    2      |  4/4/2010

条目状态表(状态):

代码语言:javascript
复制
  UserID   | StatusDate  | Detail
  -------------------------------
    1      |  5/28/2010  |  D-1
    1      |  4/24/2010  |  D-2
    1      |  4/5/2010   |  D-3
    1      |  2/28/2010  |  D-4

预期输出:

代码语言:javascript
复制
UserID | EntryDate | Detail
---------------------------
  1    | 5/4/2010  |  D-2
  1    | 4/4/2010  |  D-4
  1    | 3/4/2010  |  D-4
  1    | 2/4/2010  | <NULL>

在我的previous question中,您可以看到我的努力和相关的答案,但为了简化问题,我缩小了范围。

我试着做这样的事情(但我知道我肯定要离开了):

代码语言:javascript
复制
         SELECT E.EntryDate, 
                S.Detail, 
                MAX(S.StatusDate) AS MaxStatusDate
           FROM Entry AS E 
LEFT OUTER JOIN Status AS S ON E.EntryDate >= S.StatusDate
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-13 20:36:11

我想你想要的是

代码语言:javascript
复制
SELECT E.UserID
    , E.EntryDate
    , (SELECT TOP 1 Detail
       FROM Status AS S
       WHERE S.UserID = E.UserID
       AND S.StatusDate <= E.EntryDate
       ORDER BY S.StatusDate DESC)
FROM Entry AS E

如果您的数据库不支持TOP,或者出于性能原因,您希望避免使用ORDER BY,您可以尝试这样的方法:

代码语言:javascript
复制
SELECT E.UserID
    , E.EntryDate
    , (SELECT S1.Detail
       FROM Status AS S1
       WHERE S1.UserID = E.UserID
       AND S1.StatusDate = (SELECT MAX(S2.StatusDate)
                            FROM Status AS S2
                            WHERE S2.UserID = E.UserID
                            AND S2.StatusDate <= E.EntryDate))
FROM Entry AS E
票数 3
EN

Stack Overflow用户

发布于 2011-03-13 20:35:41

我不认为有一种通用的方法,但在某些SQL方言中,您可以在子查询中使用TOP或LIMIT来根据另一列中的排序(ORDER )从第一个匹配记录中的列中获取值。

比如说..。

代码语言:javascript
复制
SELECT
  Entry.*,
  ( SELECT TOP 1 
      Status.Detail
    FROM Status
    WHERE
      Entry.UserID = Status.UserID AND
      Entry.EntryDate >= Status.StatusDate
    ORDER BY
      Entry.EntryDate
  ) As StatusDetail
票数 1
EN

Stack Overflow用户

发布于 2011-03-13 20:44:27

对于支持它的数据库,采用row_number方式:

代码语言:javascript
复制
SELECT  *
FROM    (
        SELECT  ROW_NUMBER() OVER (
                    PARTITION BY e.UserId, e.EntryDate
                    ORDER BY s.StatusDate desc) as rn
        ,       *
        FROM    Entry e
        INNER JOIN    
                Status s
        ON      s.UserID = e.UserID
                AND s.StatusDate <= e.EntryDate
        ) as SubQueryAlias
where   rn = 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5292145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档