我在泡菜中。
我创建了一个比赛计时系统,可以联接多个表。这工作正常。有一个用于读取RFID的表格(标签ID和时间)。标签ID的表格与比赛编号相匹配,而运动员姓名的表格与比赛编号相匹配。效果很好...
df.stack().reset_index(level=0, drop=True).sort_index()
我遇到的问题是,我想添加一个新表,该表具有比赛中检查点的扫描读数。因此,存在一个名为readingsCheckpoint的新表。问题是一些跑步者由于各种原因不会在检查站被扫描。我需要有一个JOIN语句,如果该值存在,则将其添加到新的readingsCheckpoint数据中,但如果该值不存在,则不从语句中返回NULL。在比赛期间,很可能很可能在完成时间之前(在readingTable中显示)存在检查点扫描。
当前数据示例...
带有示例数据的读数表:
SELECT s.firstName
, s.lastName
, s.event
, h.time
, h.action
, h.tagId
FROM $runnerTable s
INNER JOIN $chipData hp
on s.raceNumber = hp.bandID
LEFT JOIN $readingTable h
on hp.tagId = h.tagId WHERE event = 'Full' ORDER BY h.action, h.time ASC
带有示例数据的跑步者表:
id, tagID, time, action
1, 12345, 1509, 1
chip data chipFiveTwice:
runnerId, raceNumber, firstName, lastName, event
1, , 45 , Timothy , Jones , Full
以及与读数表相同的新检查点表:
bandId, tagId
45 , 12345
上面的当前SQL将产生如下结果:
id, tagID, checkTime, action
1, 12345, 1501 . , 1
如您所见,它将RFID与赛车手连接起来,并显示他们的姓名和时间。
如何将检查点扫描添加到此SQL语句以产生此结果?
firstName, lastName, event, raceNumber, time, action, tagId
Tim , Jones , Full , 45 , 1509, 1 , 12345
但是要显示一个时间(如果您是一个)和/或一个checkTime(如果一个)。预先感谢。
答案 0 :(得分:0)
我已经通过@ spencer7593的一些帮助以及该语句的WHERE部分的一些额外逻辑来设法解决了这个问题。
SELECT s.firstName
, s.lastName
, s.event
, h.time
, h.action
, h.tagId
, rc.checkTime
FROM runners s
INNER JOIN chipFiveTwice hp
on s.raceNumber = hp.bandID
LEFT JOIN readings h on hp.tagId = h.tagId
LEFT JOIN readingsCheckpoint rc ON rc.tagid = hp.tagid AND rc.checkTime IS NOT NULL
WHERE rc.checkTime IS NOT NULL OR h.time IS NOT NULL AND event = 'full'