Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 甲骨文将两行合并为一行_Sql_Oracle_Group By_Dense Rank - Fatal编程技术网

Sql 甲骨文将两行合并为一行

Sql 甲骨文将两行合并为一行,sql,oracle,group-by,dense-rank,Sql,Oracle,Group By,Dense Rank,我计划把两(多)行合并成一行。我的数据是这样的 ╔══════════╦════════╦═══════════╦═══════════╦════════════╗ ║ ReportID ║ Item ║ StartDt ║ EndDt ║ Statement ║ ╠══════════╬════════╬═══════════╬═══════════╬════════════╣ ║ 1 ║ 3000 ║ 11-Mar-16 ║ (null) ║ Rem

我计划把两(多)行合并成一行。我的数据是这样的

╔══════════╦════════╦═══════════╦═══════════╦════════════╗
║ ReportID ║  Item  ║ StartDt   ║ EndDt     ║ Statement  ║
╠══════════╬════════╬═══════════╬═══════════╬════════════╣
║  1       ║ 3000   ║ 11-Mar-16 ║ (null)    ║ Remark     ║
╠══════════╬════════╬═══════════╬═══════════╬════════════╣
║  1       ║ 3001   ║ 11-Mar-16 ║ 13-Mar-16 ║ (null)     ║
╠══════════╬════════╬═══════════╬═══════════╬════════════╣
║  2       ║ 4002   ║ 24-May-16 ║ 27-May-16 ║ Remark1    ║
╠══════════╬════════╬═══════════╬═══════════╬════════════╣
║  2       ║ 4003   ║ 24-May-16 ║ 28-May-16 ║ Remark1    ║
╚══════════╩════════╩═══════════╩═══════════╩════════════╝
我希望通过
ReportID
合并并使用不同的规则:

  • 使用最高的
    endDt
  • 使用非空的
    语句
  • 使用具有最高
    项的记录的
    语句
因此,结果应该是

╔══════════╦═══════════╦═══════════╦════════════╗
║ ReportID ║ StartDt   ║ EndDt     ║ Statement  ║
╠══════════╬═══════════╬═══════════╬════════════╣
║  1       ║ 11-Mar-16 ║ 13-Mar-16 ║ Remark     ║
╠══════════╬═══════════╬═══════════╬════════════╣
║  2       ║ 24-May-16 ║ 28-May-16 ║ Remark1    ║
╚══════════╩═══════════╩═══════════╩════════════╝
我需要用普通SQL实现这一点,但不能编写PL-SQL例程

数据
您希望每个
reportid
有一行,因此可以按它分组。然后使用适当的聚合函数(即语句列的
KEEP FIRST/LAST
)获得所需的值:

select 
  reportid,
  max(startdt) as startdt,
  max(enddt) as enddt,
  max(statement) keep (dense_rank last 
                         order by case when statement is null then 1 else 2 end, item
                      ) as statement
from mytable
group by reportid
order by reportid;

您希望每个
reportid
有一行,因此可以按它分组。然后使用适当的聚合函数(即语句列的
KEEP FIRST/LAST
)获得所需的值:

select 
  reportid,
  max(startdt) as startdt,
  max(enddt) as enddt,
  max(statement) keep (dense_rank last 
                         order by case when statement is null then 1 else 2 end, item
                      ) as statement
from mytable
group by reportid
order by reportid;

带有
keep
last
的提示非常有价值!太多了!带有
keep
last
的提示非常有价值!太多了!