【问题标题】:SQL latest date and eventSQL 最新日期和事件
【发布时间】:2015-10-23 13:02:00
【问题描述】:

我需要提取特定事件发生的最新日期。在数据库中,我有一个由每个用户多次完成的测试。我只希望用户的最后一次测试结果低于 200。

create table #temp_VL (cln_urn varchar(50), tst_date datetime, tst_df_test_name varchar (50), VL DECIMAL (10,2), cln_pk varchar(100)) 

是我要导入数据的表。我遇到的问题是有些人在某个时候测试低于 200,但后来又回到了 200 以上。我可以拉出所有测试低于 200 的人,但由于某种原因,那是最后一次。

【问题讨论】:

  • 无法想象你在问什么。请用样本数据和期望的结果来说明。

标签: sql sql-server tsql reporting-services ssrs-2008


【解决方案1】:

如果我正确理解了您的要求,那就是:

给我每个用户得分低于 200 分的最新记录

以下代码显示了实现此目的的示例:

DECLARE @tabTestResults TABLE
    (
        UserId INT,
        TestDate DATE,
        Result INT
    )

INSERT
INTO    @tabTestResults
        (
            UserId,
            TestDate,
            Result
        )
VALUES  ( 1, '2015-01-01', 180 ),
        ( 1, '2015-07-23', 200 ),
        ( 1, '2015-08-23', 190 ),
        ( 1, '2015-09-23', 210 ),
        ( 2, '2015-01-01', 210 ),
        ( 2, '2015-10-23', 190 ),
        ( 3, '2015-10-23', 170 ),
        ( 4, '2015-10-23', 220 )


SELECT  UserId, TestDate, Result
FROM
        (
            SELECT  ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY TestDate DESC) AS RowNumber, *
            FROM    @tabTestResults
            WHERE   Result < 200
        ) SQ
WHERE   RowNumber = 1

返回:

UserId  TestDate    Result
1       2015-08-23  190
2       2015-10-23  190
3       2015-10-23  170

【讨论】:

    【解决方案2】:

    假设您希望按照您所说的那样在最后一个日期评分低于 200 的用户。

    我只希望用户的最后一次测试结果低于 200。

    您可以使用以下查询。

    with CTE as
    (
        select 1 UsrID, '2015-08-01' [Date], 190 rate
        union
        select 1 UsrID, '2015-08-02' [Date], 290 rate
        union
        select 2 UsrID, '2015-08-03' [Date], 190 rate
        union
        select 3 UsrID, '2015-08-04' [Date], 390 rate
        union
        select 3 UsrID, '2015-08-07' [Date], 150 rate
        union
        select 4 UsrID, '2015-08-09' [Date], 140 rate
    )
    
    select CTE.UsrID,CTE.Date,CTE.rate
    from CTE
    inner join
        (
        select UsrID,max(Date) maxdate
        from CTE
        group by UsrID
        ) dt
    on CTE.UsrID = dt.UsrID and CTE.Date = dt.maxdate
    where rate < 200
    

    以我举的数据为例,你会得到:

    UsrID   Date    rate
    2   2015-08-03  190
    3   2015-08-07  150
    4   2015-08-09  140
    

    【讨论】:

    • @JFulton:太好了!因此,如果您认为它可以帮助您通过单击我的答案右侧的正确符号来选择我的答案是正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多