1

我正在尝试通过必须引用旅行调查数据集中先前行的分组构造来计算索引。我想不出一个合适的查询结构来获得我所追求的东西,并希望得到社区的帮助。除了 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  

...ETC。

我遇到的麻烦是如何创建必要的标准:

  1. 将旅行计为调查受访者离开和回家的单独实例
  2. 将多站行程计为同一行程
  3. 更改为下一个调查对象(即 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(..
4

1 回答 1

1

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

使用以下草图来识别您的旅行起点和终点;根据索引(无论是从 0 还是从 1 开始),您可能需要翻转 trip_start 逻辑。

一旦您有了识别起点和终点的逻辑,创建旅行起点主表就不难了,您可以在其中定义按人员划分的旅行编号,将其连接到相应的旅行终点,以便每条记录都是在记录中定义起点和终点的一次行程,然后在 uniqueID > startingPoint 和 uniqueID <= endingPoint 上最后一次加入原始表以获取行程中的所有站点,

select *, case when row_number % 2 = 0 then 'trip start' else 'trip end' end as trip_start

选择 *, row_number over (partition by personID) from Your_Table where PlaceType = 'Home'

于 2013-11-06T08:07:27.787 回答