TOP 1记录基于联合表中每条记录的日期

时间:2016-03-04 21:47:28

标签: sql sql-server-2008-r2

我有一个变量表" @USERS"以及基于生效日期的USERCLASS数据库表。我需要做的是在确定的日期填充USERCLASS。 实施例:

@USERS

USERID | OTHER
--------------
A1     |  1
B1     |  2
C1     |  3
D1     |  4

DBCLASSTABLE

USERID | CLASS | EFFECTIVEDATE
------------------------------
A1     |  ZZ   | 2015-02-01
A1     |  XX   | 2014-02-01
B1     |  TT   | 2015-02-01
B1     |  RR   | 2014-02-01
etc..

根据2015-01-01的日期...将参加的2014年有效课程。

我拥有的是:

SELECT
    USERID,
    OTHER,
    'CLASS' = (SELECT TOP 1
                   A.CLASS
               FROM
                   DBCLASSTABLE A
                   JOIN @USERS B on A.USERID = B.USERID
               WHERE A.USERID = B.USERID AND A.EFFECTIVEDATE < 2015-01-01
               ORDER BY A.EFFECTIVEDATE DESC
              )
FROM
    @USERID

但是,我显然做错了,因为它返回所有记录的DBCLASSTABLE的TOP。

USERID | OTHER | CLASS
----------------------
A1     |  1    |  ZZ
B1     |  2    |  ZZ
C1     |  3    |  ZZ
D1     |  4    |  ZZ

使用此样本数据,它只应返回

USERID | OTHER | CLASS
-----------------------
A1     | 1     | XX
B1     | 2     | RR

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

据推测,您需要一个相关的子查询。您的问题提到了一个表@USERS,但未提及@USERIDS。我猜他们是一样的:

SELECT USERID, OTHER,
       (SELECT TOP 1 c.CLASS
        FROM DBCLASSTABLE c
        WHERE c.USERID = u.USERID AND c.EFFECTIVEDATE < '2015-01-01'
        ORDER BY A.EFFECTIVEDATE DESC
       ) as Class
FROM @USERS u;

答案 1 :(得分:0)

您可以使用以下查询:

SELECT      users.userid, users.other, class.class
from        users users
inner join  dbclass class on users.userid = class.userid
where       class.EffectiveDate < '2015-01-01'

你可以在这看到这个 - &gt; http://sqlfiddle.com/#!9/9506c1/2

希望这有帮助!!!