我有这张桌子:
| 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”值。
答案 0 :(得分:1)
使用GROUP BY
:
select TRIMESTER
from MyTable
group by trimester
order by max(DAY)
使用RANK
和PARTITION
:
SELECT TRIMESTER
FROM (
SELECT TRIMESTER,
RANK() OVER (partition by TRIMESTER ORDER BY DAY DESC) DAYRANK
FROM MyTable)
WHERE DAYRANK = 1;
答案 1 :(得分:0)
这应该这样做:
SELECT TRIMESTER
FROM MY_TABLE
GROUP BY TRIMESTER
ORDER BY MIN (DAY);