根据另一列选择不同的结果

时间:2012-08-16 15:23:19

标签: sql oracle11g

我有这张桌子:

| DAY | TRIMESTER |

日是一个整数值,总是在增加(它计算从第0天开始经过的秒数)。 TRIMESTER包含一个String值('FIRST','SECOND','THIRD'等)。我需要按照正确的顺序获得三个月的清单。

SELECT DISTINCT TRIMESTER FROM table

返回:

| TRIMESTER |
|   FIRST   |
|   THIRD   |
|   SECOND  |

我已经评估过这可以解决我的问题:

SELECT  DISTINCT TRIMESTER, SUM(DAY) FROM table GROUP BY TRIMESTER ORDER BY SUM(DAY)

是否有一个更好的解决方案可以输出我需要的东西,这需要数据库完成更少的计算?数据库是Oracle 11g,表格应该变得非常大。

示例数据:

| DAY | TRIMESTER |
|  0  |  FIRST    |
|  10 |  FIRST    |
|  12 |  FIRST    |
|  20 |  FIRST    |
|  30 |  SECOND   |
|  35 |  SECOND   |
|  46 |  THIRD    |

我需要按顺序排列:'FIRST','SECOND'和'THIRD'。无论如何,我无法控制TRIMESTER列中的键。它们是字符串,可能只是任何字符串,我不能按名称对它们进行排序。我只知道它们涵盖了DAY值的“范围”。例如。如果我在示例中的“DAY”值介于31和34之间,则它们在三个月的列中都具有“SECOND”值。

2 个答案:

答案 0 :(得分:1)

使用GROUP BY

select TRIMESTER 
from MyTable 
group by trimester 
order by max(DAY)

SQL Fiddle Example #1

使用RANKPARTITION

SELECT TRIMESTER
FROM (
  SELECT TRIMESTER,
  RANK() OVER (partition by TRIMESTER ORDER BY DAY DESC) DAYRANK
  FROM MyTable)
WHERE DAYRANK = 1;

SQL Fiddle Example #2

答案 1 :(得分:0)

这应该这样做:

SELECT   TRIMESTER
FROM     MY_TABLE
GROUP BY TRIMESTER
ORDER BY MIN (DAY);