Py学习  »  Python

Python/SQL:存储序列

user07345 • 3 年前 • 1475 次点击  

我有下表( schedule )在我的数据库中(25万行):

身份证件 路线号 路线_long_name 旅行id 方向号 住手 停止你的名字 到达时间
1 70111001900000 红线 14010000574353508 0 9022001001281076 中央车站 04:42:00
2. 70111001900001 黄线 14010000574345371 0 9022001001282313 医院 04:43:00
3. 70111001900002 蓝线 14010000574245335 0 9022001001224379 斯普纳街。 04:44:00

驻留在其中的数据来自 GTFS static 在我的镇上吃饭。它是相当标准化的,包含每种车型、路线、车站等的描述。

当静态数据库中包含来自数据库的更新时,就会出现问题 GTFS realtime 喂养TripUpdates feed没有指定正在驾驶的车辆属于哪条线路,如果 这是为了应对突然增加的乘客数量,或者如果之前的车辆坏了 .

TripUpdates :

trip_update {
 trip {
   trip_id: "14010000574353508"      # Exists in the database
   start_date: "20220204"
   schedule_relationship: SCHEDULED  # Trip is scheduled, everything is OK
 }
 stop_time_update {
   stop_sequence: 72
   arrival {
     delay: 147
     time: 1643833304
     uncertainty: 0
   }
   departure {
     delay: 147
     time: 1643833304
     uncertainty: 0
   }
   stop_id: "9022001001281076"       # Exists in the database, "Central station"
 }
 vehicle {
   id: "9031001000158703"
 }
}
trip_update {
 trip {
   trip_id: "14010513667077909"      # Does not exist in the database
   start_time: "21:06:00"
   start_date: "20220204"
   schedule_relationship: ADDED      # New trip, needs to be added to the database 
 }
 stop_time_update {
   stop_sequence: 1
   arrival {
     delay: 0
     time: 1643833260
   }
   departure {
     delay: 0
     time: 1643833260
   }
   stop_id: "9022001001282313"       # Exists in the database, "Hospital"
 }
 stop_time_update {
   stop_sequence: 2
   arrival {
     delay: 0
     time: 1643833299
   }
   departure {
     delay: 0
     time: 1643833299
   }
   stop_id: "9022001001282314"       # Exists in the database, "Hogwarts", definitely Yellow line 
 }
 vehicle {
   id: "9031001002500015"
 }
 timestamp: 1643829559
}

我想做的是,根据车辆停下来的次数来确定车辆属于哪条线路,一旦我确定了,就将其添加到数据库中。为了更好地说明我的意思,我画了下面的地铁线路示意图。

subway lines example

以我的地铁地图为例:

  • 如果旅行从 地下一层 然后去 B7 -将其作为蓝线添加到数据库中。
  • 如果旅行从 X1 然后去 Y5 -将其作为黄线添加到数据库中。
  • 如果旅行从 X1 然后去 X3 -将其作为“额外行”添加到数据库中。

我已经有一张桌子了 stop_id 属于每一条地铁线路的:

红线:

  • 9022001001281079-斯普纳街。
  • 9022001001281078-大酒店
  • 9022001001281077-中央公园
  • 9022001001281076 - 中央车站

蓝线:

  • 9022001001221005-机场
  • 9022001001221004-约翰·约翰森街。
  • 9022001001221003-城市教堂
  • 9022001001221002 - 中央车站

黄线:

  • 9022001001282314-霍格沃茨
  • 9022001001282313-医院
  • 9022001001282312 - 中央车站

我的程序是用Python编写的,使用sqlite3数据库。我尝试过使用if语句,这导致了无法维护或读取的意大利面代码。我还尝试了不同的表连接,并将站名转换为二进制模式,不幸的是,这也导致了相同的意大利面代码。

我的问题是 如果有任何方法可以处理Python或SQL中的模式(想一想它更多的是关于SQL的),那么可以根据预期的行程停止点为行程分配一行吗?

基本上(伪代码):

IF anything BETWEEN 9022001001281079 AND 9022001001281071 -> "Red line"
IF anything BETWEEN 9022001001221005 AND 9022001001209996 -> "Blue line"
IF anything BETWEEN 9022001001282314 AND 9022001001282307 -> "Yellow line"
ELSE -> "Extra line"

记住 住手 s不是序列号。 本文中提供的ID只是示例,在真实的GTFS提要中,一个站点的ID可能为9022001001221005,下一个站点(在同一线路上)的ID可能为9022003201321094。

更新1 :

SQL CASE和BETWEEN在这里不起作用。

我尝试了评论中提供的解决方案(使用SQL),发现了一些问题。

在我从中提取最大值和最小值之后 住手 对于地铁线路,我得到以下方案:

红线 : 9022001001011003 - 9022001002851002

蓝线 : 9022001001051005 - 9022001003481002

黄线 : 9022001001011001 - 9022001001951002

因为第一部分 住手 总是一样的,我在进一步的描述中排除了它。

如果火车从 1011003 1011007 ,SQL CASE和BETWEEN将无法正确检测地铁线路,因为该范围适用于红线和黄线。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128544
 
1475 次点击  
文章 [ 1 ]  |  最新文章 3 年前