【问题标题】:Getting the most recent entry per group in a select statement在 select 语句中获取每个组的最新条目
【发布时间】:2010-05-06 07:26:25
【问题描述】:

我有 3 个表要加入以获取 table1.code、table1.series、table2.entry_date、table3.title1 我正在尝试获取按 table1.code 和 table1.series 分组的最新非空 table3.title1。

select table1.code, table1.series, max(table2.entry_date), table3.Title1 
                from table3 INNER JOIN table2 ON  table3.ID = table2.ID
                INNER JOIN table1 ON table2.source_code = table1.code
                where table3.Title1 is not NULL 
                group by table1.code, table1.series, table3.Title1

似乎给了我所有带有非空 title1 的条目而不是最近的条目。我应该如何构造查询以仅选择每个代码和系列的 Title1 的最新版本?

【问题讨论】:

  • 您能提供一些示例数据吗?

标签: sql sql-server tsql


【解决方案1】:

试试这个:

select table1.code, table1.series, max(table2.entry_date), max(table3.Title1) as Title1
from table3 
INNER JOIN table2 ON  table3.ID = table2.ID
INNER JOIN table1 ON table2.source_code = table1.code
where table3.Title1 is not NULL 
And Table2.entry_Date = (Select Max(sq.entry_Date)
                        From sq.table2
                        Where sq.id = table2.ID)
group by table1.code, table1.series

【讨论】:

  • 这给出了最近的日期,但没有给出相应的最近添加的标题。
  • 也许你需要改变表格的顺序;所以从table1中选择,然后加入table2和table3。你能发布一些 DDL 和示例数据吗?
【解决方案2】:

也许像这样只加入最近的 table2 条目?

SELECT
    table1.code,
    table1.series,
    table2.entry_date,
    table3.Title1
FROM
    table1
INNER JOIN
    table2
ON
    table2.source_code = table1.code
AND
    table2.entry_date =
(
    SELECT
        MAX(maxtable2.entry_date)
    FROM    
        table2 maxtable2
    WHERE
        maxtable2.source_code = table2.source_code
)
INNER JOIN
    table3
ON
    table3.ID = table2.ID

【讨论】:

    【解决方案3】:
    ;with tlb as
    (
        select table1.code, table1.series, table2.entry_date, table3.Title1,
        row_number() over(code, series, entry_date order by code, series, entry_date desc) as rn
        from table3 INNER JOIN table2 ON table3.ID = table2.ID 
        INNER JOIN table1 ON table2.source_code = table1.code 
        where table3.Title1 is not NULL
    )
    select * from tlb where rn = 1
    

    这可能非常快,具体取决于您的索引。

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多