Sql 基于以前的行按条件创建和索引计数行

Sql 基于以前的行按条件创建和索引计数行,sql,postgresql,survey,Sql,Postgresql,Survey,我试图通过分组构造计算索引,该分组构造必须引用旅行调查数据集中的前几行。我无法找到一个合适的查询结构来获得我想要的,并希望从社区获得帮助。除TRIPNUM列外,我的旅行数据集如下所示,我希望TRIPNUM列如下所示,或者如果TRIPNUM2更简单: UniqueID, PersonID, PlaceType, PlaceTpyeInt, TravelMode, TRIPNUM, TRIPNUM2 6001, 600, Home,

我试图通过分组构造计算索引,该分组构造必须引用旅行调查数据集中的前几行。我无法找到一个合适的查询结构来获得我想要的,并希望从社区获得帮助。除TRIPNUM列外,我的旅行数据集如下所示,我希望TRIPNUM列如下所示,或者如果TRIPNUM2更简单:

UniqueID,       PersonID,   PlaceType,  PlaceTpyeInt, TravelMode, TRIPNUM, TRIPNUM2 
6001,           600,        Home,       0,            None,       0,       0
6002,           600,        Store,      4,            Car,        1,       1
6003,           600,        Home,       0,            Car,        0,       1
6004,           600,        Store,      4,            Car,        2,       2
6005,           600,        Store,      4,            Car,        2,       2
6006,           600,        Home,       0,            Car,        0,       2
6011,           601,        Home,       0,            None,       0,       0
6012,           601,        Store,      4,            Car,        1,       1  
……等等

我遇到的问题是如何创建必要的标准,以:

  • 将出行计算为调查对象离开和回家的单独实例
  • 将多站行程计算为同一行程
  • 更改为下一个调查受访者(即PersonID)时重置TRIPNUM
  • 是否需要编写一个迭代函数来执行此操作,或者是否有方法引用前一行,检查它是否为同一PersonID,然后根据前一行的TRIPNUM为其赋值

    更新:我已尝试实现此代码构造,但不确定这是否是唯一personid循环行的正确循环构造

        CREATE OR REPLACE FUNCTION tripcounter(int) RETURNS TABLE AS
    $BODY$
    DECLARE 
    temptrip int;
    uniqueid int;
    personid int;
    tripcount int;
    
    BEGIN
    FOREACH personid in $1
    temptrip = 0
    select uniqueid, perid, ptype, from $1
    FOREACH uniqueid
    CASE WHEN ptye = 1 
            THEN    tripcount = 0
                temptrip = temptrip + 1
          ptype <> 1
            THEN
                tripcount = temptrip
    
    
    END LOOP;
    END;
    LANGUAGE plpgsql;
    
        ERROR:  syntax error at or near "tripcount"
    LINE 1: ...R REPLACE FUNCTION tripcounter(int) RETURNS TABLE tripcount(..
    
    CREATE或REPLACE函数tripcounter(int)将表返回为
    $BODY$
    声明
    诱惑;
    唯一整数;
    人格智力;
    tripcount int;
    开始
    FOREACH personid,单位:1美元
    第二个RIP=0
    从$1中选择uniqueid、perid、ptype
    FOREACH uniqueid
    当ptye=1时的情况
    那么tripcount=0
    TENTRIP=TENTRIP+1
    p类型1
    然后
    tripcount=trip
    端环;
    结束;
    语言plpgsql;
    错误:“tripcount”处或附近出现语法错误
    第1行:…R替换函数tripcounter(int)返回表tripcount(。。
    
    如果每次旅行都以PlaceType=Home开始和结束,并假设您的唯一ID按时间顺序进行,那么使用带窗口的分析SQL函数(如行数和模函数)(以下用%表示)似乎很容易做到

    使用以下内容作为如何识别行程起点和终点的示意图;根据索引(从0还是1开始),您可能需要翻转行程开始逻辑


    一旦你有了识别起点和终点的逻辑,就不难创建一个行程起点主表,在主表中定义按人划分的行程编号,将其连接到相应的行程终点,这样每个记录都是一次行程,在记录中定义了起点和终点,然后在uniqueID>startingPoint和uniqueID上最后一次访问原始表,如果每次旅行都以PlaceType=Home开始和结束,并且假设您的唯一ID按时间顺序进行,那么使用带窗口的分析SQL函数(如row_number)和模函数(由下面的%表示)似乎很容易做到

    使用以下内容作为如何识别行程起点和终点的示意图;根据索引(从0还是1开始),您可能需要翻转行程开始逻辑


    一旦你有了识别起点和终点的逻辑,就不难创建一个行程起点主表,在主表中定义按人划分的行程编号,将其连接到相应的行程终点,这样每个记录都是一次行程,在记录中定义了起点和终点,然后在uniqueID>startingPoint和uniqueID上最后一次进入原始表那么你的代码在哪里?你能粘贴它吗?我还没有。我一直在到处搜索一个可以引用特定行的函数,但不知道如何解决这个问题。我需要为此编写一个函数吗?到目前为止,我已经从我的_表中选择了*其中placetypeint为0,但它不基于时间顺序的行程顺序进行分离如何确定“时间顺序的行程顺序”根据你提供的信息?你能用简单的语言解释一下你在
    tripnum2
    中期望的值背后的逻辑吗?那么你的代码在哪里?你能粘贴它吗?我还没有。我一直在到处搜索一个可以引用特定行的函数,但不知道如何解决这个问题。我需要写吗e一个函数?到目前为止,我已经从我的表格placetypeint 0中选择了*,但它并没有根据时间顺序分开。如何根据您提供的信息确定“时间顺序”呢?您能简单地解释一下
    tripnum2
    中期望的值背后的逻辑吗?