Oracle 11g:仅当行在组中的第一个或最后一个时才返回值

use*_*653 3 sql oracle oracle11g

我正在尝试从Oracle查询创建报告.数据是这样的:

GROUP_ID | COUNT_1 | COUNT_2
    1    |   100   |   123
    1    |   101   |   123
    1    |   283   |   342
    1    |   134   |   123
    2    |   241   |   432
    2    |   321   |   920
    2    |   432   |   121
    2    |   135   |   342
Run Code Online (Sandbox Code Playgroud)

我想要做的只是当它在组中的第一个时返回GROUP_ID,并且当它在组中的最后一个时返回一些其他值,例如

GROUP_ID | COUNT_1 | COUNT_2
    1    |   100   |   123
         |   101   |   123
         |   283   |   342
   last  |   134   |   123
    2    |   241   |   432
         |   321   |   920
         |   432   |   121
   last  |   135   |   342
Run Code Online (Sandbox Code Playgroud)

这可能吗?

谢谢!

Erk*_*lat 7

没有测试,但这应该是主意.如果您需要按COUNT_1或COUNT_2排序,则应将其包含在"解析函数" over子句中,partition by GROUP_ID order by COUNT_1

请参阅此处以了解分析功能是什么.

select
  case when ROW_NUMBER = 1 then GROUP_ID
       when ROW_NUMBER = GROUP_COUNT then 'last'
       else NULL
  end GROUP_ID
  ,COUNT_1
  ,COUNT_2
from(
    select
      GROUP_ID
      ,COUNT_1
      ,COUNT_2
      ,row_number() over(partition by GROUP_ID) ROWNUMBER
      ,count(GROUP_ID) over (partition by GROUP_ID) GROUP_COUNT
    from
      FOO
)
Run Code Online (Sandbox Code Playgroud)