【问题标题】:Find last row in each category在每个类别中查找最后一行
【发布时间】:2012-12-26 12:42:37
【问题描述】:

我正在使用Sybase,它不支持人们在这里使用的很多很酷的功能。所以,在帮助我时请记住这一点。

我有一个看起来像这样的数据库:

类型 行时间 数量 第一类 1 10:01:01.000 50 猫 1 2 10:01.01.001 0 1 类 3 10:01:01.002 1000 1 类 4 10:01.01.003 100 1 类 5 10:01:03.001 100

除了有cat2、cat3、cat4等

我想根据 ascending order 中安排的时间从每个 类别 中找到提取的最后一行。所以,对于上面给定的表格,我想提取row 5

【问题讨论】:

    标签: sql sybase


    【解决方案1】:

    查看 sybase 文档后,您似乎有一个 rank 函数。所以这里是一个刺:

    declare @table table ( tp varchar(30), rowtime datetime, quantity int) 
    
    insert @table select 'cat1 1', '20120101', 50
    insert @table select 'cat2 1', '20130101', 50
    insert @table select 'cat3 1', '20110101', 50
    insert @table select 'cat4 1', '20100101', 50
    insert @table select 'cat5 1', '20090101', 50
    select * from (
       select *, RANK() OVER (ORDER BY  RowTime DESC) AS Rank from @table 
    ) a
    where [RANK]=1
    

    从这里获得排名函数: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00169.1270/html/iqperf/CEGDJFCE.htm

    【讨论】:

    • @user1949158 这里有两个答案.. 所以你可以同时运行这两个答案,看看哪个有效,如果两个都有效,那么你检查explain 计划... :)
    • 谢谢,这正是我想要的。
    【解决方案2】:

    这是一种方式:

    SELECT A.*
    FROM YourTable A
    INNER JOIN (SELECT Type, MAX(Time) MaxTime
                FROM YourTable
                GROUP BY Type) B
        ON A.Type = B.Type AND A.Time = B.MaxTime
    

    【讨论】:

    • 我的桌子很大,这是最有效的方法吗?
    【解决方案3】:

    SELECT * FROM table_name 按类型分组 HAVING RowTime = max(RowTime)

    【讨论】:

      【解决方案4】:

      几个 Oracle 查询可能会给您一些想法。我不确定这些分析功能是否在 Sybase 中可用。基本上,您需要按类别对查询进行分区,然后获取该类别中的最后一行 - 在您的情况下可能是 MAX(row_time) 。许多分析函数可用于此:ROW_NUMBER()、RANK()、DENSE_RANK()...

      -- Selects sal within dept with Rank = 2 --
      SELECT ename, sal, sal_rank
        FROM ( SELECT ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal ASC) sal_rank FROM scott.emp ) 
      WHERE sal_rank <= 2
      /
      
      -- MIN/MAX sal in each dept --
      SELECT empno, deptno, sal,
         MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
         MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
       FROM scott.emp
      ORDER BY deptno, sal
      /
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-18
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        相关资源
        最近更新 更多