在PostgreSQL中为行段

时间:2016-03-11 16:49:05

标签: sql postgresql join

作为我的归因建模设置的一部分,我需要将order_id分配给在分配的事务之前但在之前的任何订单之后发生的交互。

示例,我有一个这样的表:

enter image description here

我希望有这样的事情:

enter image description here

因此填写order_id为空的位置。

我尝试过使用自联接并调用order_id,其中时间是< =而不是第二次连接的时间但没有运气,这会复制某些行。

编辑:

这是我的SQL尝试:

select
c.cookie_id,
c.order_id,
c.channel,
c.min_report_timestamp
,case when lead(c.cookie_id) over (order by min_report_timestamp desc) is null then c.order_id else c.order_id end as order_id_ok

,lead(c.order_id) over (order by min_report_timestamp desc) as lead_order
--,lag(c.order_id) over (order by min_report_timestamp asc) as lag_order

from table c

group by 1,2,3,4

我对我应该使用的条件有一个想法,问题是我不能用我需要的order_id填充缺少的空格,它不会逐行“携带”订单ID

2 个答案:

答案 0 :(得分:1)

package rtp.qt;

编辑:更改了表的名称以反映OP中的名称并删除了最终查询中的额外列。

答案 1 :(得分:1)

考虑相关的聚合子查询而不需要窗口函数:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
ResourceManager objResourceManager = new ResourceManager(assembly.GetName().Name + ".g", assembly);
ResourceSet objResourceSet = objResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);
List<ImageAndDescription> imageAndDescriptions = new List<ImageAndDescription>();

foreach (System.Collections.DictionaryEntry entry in objResourceSet)
{
    string filePath = Uri.UnescapeDataString(entry.Key.ToString());
    if(filePath.StartsWith(folderPath.ToLower())
        imageAndDescriptions.Add(new ImageAndDescription(entry.Value, entry.Key.ToString()));
}