按时间戳排序,但按另一个字段分组

时间:2015-09-07 14:21:29

标签: oracle

我正在尝试编写一些复杂的查询,最终将在Web应用程序中使用。我正在为堆栈,许多部件提取一个值,然后是该批次中的光盘数和最旧的时间戳值。我有一个用于堆栈的分组,很多可以让我找出该堆栈中该批次的光盘数量。

我想要做的是让堆栈与最旧的堆栈组合在一起。

这是现在看起来的一个例子:

STACK     LOT     COUNT(CONTAINER_ID)     MIN(TIMESTAMP)
-----     ---     ---------               --------------
001       4       3                       8/30/2015 9:47:10
002       3       6                       8/30/2015 12:22:03
001       2       10                      8/31/2015 9:47:10

我希望它看起来更像这样:

STACK     LOT     COUNT(CONTAINER_ID)     MIN(TIMESTAMP)
-----     ---     ---------               --------------
001       4       3                      8/30/2015 9:47:10
001       2       10                     8/31/2015 9:47:10
002       3       6                      8/30/2015 12:22:03

这些只是表格的简短示例我是20个不同的堆栈ID,每个堆栈可能有3或4个批次。

我尝试过分区,但是当我进一步研究它时,我不确定这是否是我真正想要使用的。

SELECT STACK, LOT, COUNT(CONTAINER_ID), MIN(TIMESTAMP) 
FROM PAINT_TABLE 
GROUP BY STACK, LOT 
ORDER BY MIN(TIMESTAMP)

1 个答案:

答案 0 :(得分:1)

您的示例结构+数据与查询之间存在一些不匹配。

但一般的想法是,通过在order by子句中使用分析函数,您可以获得所需内容。像这样:

select *
from paint_table
order by min(timestamp) over (partition by stack), stack

修改

如果您希望min(timestamp)stack确定,然后根据该订单进行排序,但同时您希望按stack进行分组和lot,然后你可以这样做:

select stack, lot, count(container_id), min_stack_timestamp
  from (select t.*,
               min(t.timestamp) over (partition by t.stack) as min_stack_timestamp
          from paint_table t)
 group by min_stack_timestamp, stack, lot
 order by min_stack_timestamp, stack, lot