在不同行的行中具有相同值的窗口函数中的分区

时间:2017-06-06 12:43:26

标签: postgresql window-functions

在下图中,您可以举例说明数据。我希望每个批次首次出现 batch_start 。如您所见(绿色突出显示)批处理1522049发生在2个块中,一个有2行,第二个有1行。

SELECT FIRST_VALUE(batch_start) OVER (PARTITION BY batch ORDER BY batch_start)

没有解决问题,因为它将两个块连接成一个,结果是'2013-01-29 10:27:23'对于它们。

知道如何区分这些行并获取每个数据块的 batch_start 吗?

Example data

2 个答案:

答案 0 :(得分:1)

在我看来这是一个简单的问题:您只需要计算一个值,对于相同batch值的每个后续行都是相同的,这将是

row_number() over (order by batch_start) - row_number() over (partition by batch order by batch_start)

由此,解决方案取决于您希望如何处理这些“批处理组”。 F.ex.这是一个变体,它将聚合它们,以找出哪个是第一个batch_start

select   batch, min(batch_start)
from     (select *, row_number() over (order by batch_start) -
                    row_number() over (partition by batch order by batch_start) batch_number
          from   batches) b
group by batch, batch_number

http://rextester.com/XLX80303

答案 1 :(得分:0)

可能:批量选择batch,min(batch_start)firstOccurance,max(batch_start)来自yourTable组的lastOccurance

或尝试(保留您的部分查询): 从你的表a中选择FIRST_VALUE(a.batch_start)OVER(a.batch ORDER by a.batch_start的PARTITION) 在a.batch = b.batch

上加入(从批次中选择批次,分钟(批次编号)firstOccurance,max(batch_end)lastOccurance)