根据先前行的条件创建和索引计数行

时间:2013-09-20 00:01:41

标签: sql postgresql survey

我试图通过分组构造计算索引,该构造必须引用旅行调查数据集中的先前行。我无法弄清楚一个正确的查询结构,以获得我所追求的东西,并希望得到社区的帮助。我的旅行数据集在下面的表格中除了T​​RIPNUM栏之外,我想让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  

...等

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

  1. 计算旅行作为调查受访者离开和返回家园的单独实例
  2. 计算同一行程的多站旅程
  3. 更改为下一个受访者(即PersonID)时重置TRIPNUM
  4. 是否有必要编写一个迭代函数来执行此操作,或者有没有办法引用上一行,检查它是否是相同的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(..
    

1 个答案:

答案 0 :(得分:1)

如果每次旅行以PlaceType = Home开始和结束,并假设您的唯一ID按时间顺序进行,那么使用窗口分析SQL函数(如row_number和模数函数(由%表示)似乎很容易。

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

一旦你有了识别起点和终点的逻辑,创建一个行程起始点的主表就不会太难了,你可以在其中定义人员划分的行程编号,将其连接到相应的行程终点,每条记录是一次旅行,其中包括在记录中定义的起点和终点,然后在uniqueID&gt;上最后一次加入原始表。 startingPoint和uniqueID&lt; = endingPoint抓住旅行中的所有站点,

选择*,当row_number%2 = 0时的情况,然后'trip start',否则'trip end'结束为trip_start

从Your_Table中选择*,row_number over(由personID分区) 其中PlaceType ='Home'