【问题标题】:max records with dense rank具有密集等级的最大记录
【发布时间】:2011-06-22 13:09:31
【问题描述】:

有没有更好的替代使用 max 来获取最大记录。 我一直在使用以下查询进行密集排名和分区 但我得到了不理想的结果和糟糕的表现。

select Tdate = (Select  max(Date)  
                    from Industries 
                    where Industries.id = i.id 
                        and Industries.Date <= '22 June 2011')
    from #ii_t i

非常感谢。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    提供的查询不使用DENSE_RANK 窗口函数。不熟悉您的数据结构,我相信您的查询正在尝试为每个行业 id 找到 Date 的最大值,是吗?将上面的查询重写为使用排名函数,我会写成公用表表达式。

    ;
    WITH RANKED AS
    (
        SELECT
            II.*
        -- RANK would serve just as well in this scenario
        ,   DENSE_RANK() OVER (PARTITION BY II.id ORDER BY II.Date desc) AS most_recent
        FROM Industries II
        WHERE
            II.Date <= '22 June 2011'
    )
    , MOST_RECENT AS
    (
        -- This query restricts it to the most recent row by id
        SELECT
            R.*
        FROM
            RANKED R
        WHERE 
            R.most_recent = 1
    )
    SELECT
        *
    FROM
        MOST_RECENT MR
        INNER JOIN
            #ii_t i
            ON i.id = MR.id
    

    此外,为了解决性能问题,您可能需要了解行业的结构。该表上可能没有索引,如果有,它可能不会覆盖 Date(降序)和 id 字段。为了提高上述查询的效率,不要将RANKED部分的所有内容都拉回来。我这样做是因为我不确定您需要哪些字段,但显然您需要撤回的越少,引擎检索数据的效率就越高。

    【讨论】:

    • 非常感谢你们,指引我朝着正确的方向前进。
    【解决方案2】:

    您使用的是哪个数据库?如果您在 Oracle 上,您可以编写一些带有循环的 pl/sql 来寻找最大值(它不是那么高效,但它是可能的)。如果您打算构建一个查询来执行此操作,则必须使用分析函数。

    【讨论】:

      【解决方案3】:

      试试这个(未经测试的)代码,看看它是否符合您的要求。从外观上看,它应该返回相同的内容,并且希望更快一些。

      select Tdate = max(Industries.Date)    
      from #ii_t i
        left outer join Industries
          on Industries.id = i.id and
             Industries.Date <= '22 June 2011'
      group by i.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-18
        • 2022-01-23
        • 2011-04-03
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多