Sql 如何从重复记录中获取最新更新的数据?

Sql 如何从重复记录中获取最新更新的数据?,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我有三张桌子。表1具有memberhsip id并加入到具有注册id的Tbl2。Tbl3具有我感兴趣的数据。 在一个完美的世界里,一个成员不应该在同一日期段有2个注册id;然而,它确实有。 我对最新更新的注册id感兴趣。 其中一个标准是生效日期和有效期。例如,如果我正在寻找2018年1月1日至2018年2月1日的生效日期和有效期,SQL将为成员1提供2条匹配记录。如何从Tbl3获取“上次更新”的最大值 Tbl1 Tbl2 Tb3 我不确定您的预期输出应该是什么,在没有提供数据的情况下,我还没有测

我有三张桌子。表1具有memberhsip id并加入到具有注册id的Tbl2。Tbl3具有我感兴趣的数据。 在一个完美的世界里,一个成员不应该在同一日期段有2个注册id;然而,它确实有。 我对最新更新的注册id感兴趣。 其中一个标准是生效日期和有效期。例如,如果我正在寻找2018年1月1日至2018年2月1日的生效日期和有效期,SQL将为成员1提供2条匹配记录。如何从Tbl3获取“上次更新”的最大值

Tbl1

Tbl2

Tb3


我不确定您的预期输出应该是什么,在没有提供数据的情况下,我还没有测试过-但是您可以根据需要在“选择”中编辑以下内容,它应该为您提供最新的最长更新日期:

select * from 
(
select a.[member id]
    , b.[enrollment id]
    , c.[effective date]
    , c.[term date]
    , c.[last update]
    , row_number() over (partition by a.[member id] order by c.[last update] desc) row_num
        from tbl1 a
            join tbl2 b on a.[member id] = b.[member id]
            join tbl3 c on b.[enrollment id] = c.[enrollment id]
) x
where row_num = 1
;

你用哪一种?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签,
postgresql
oracle
db2
sqlserver
,…您真的有一个只包含id而没有其他列的表吗?“这似乎太多余了。”“不,不是真的,但这是解释我困境的唯一方法。”。我需要从那个表开始。从逻辑上看,这看起来很接近,但列名在语法上是错误的。要在列名中使用空格和其他可怕的字符,必须将它们括在[方括号]中。
|Member ID |  Enrollment ID |
|--------- | ---------------|
|    1     |        E1      |
|----------| ---------------|
|    1     |        E2      |
|---------------------------|
---------------------------------------------|-------------------------|
| Enrollment ID | Effective Date | Term Date |       Last Update       |
|---------------|----------------|-----------|-------------------------|
|      E1       | 1/1/2018       |  2/1/2018 | 2018-01-19 11:20:03.483 |
|---------------|----------------|-----------|-------------------------|
|      E2       | 1/1/2018       |  2/1/2018 | 2018-01-19 13:28:20.923 |
|---------------|----------------|-----------|-------------------------|
select * from 
(
select a.[member id]
    , b.[enrollment id]
    , c.[effective date]
    , c.[term date]
    , c.[last update]
    , row_number() over (partition by a.[member id] order by c.[last update] desc) row_num
        from tbl1 a
            join tbl2 b on a.[member id] = b.[member id]
            join tbl3 c on b.[enrollment id] = c.[enrollment id]
) x
where row_num = 1
;