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