我将简化提出这个问题的基础。我在ORACLE数据库中有两个表:一个表称为‘tb_vehicle’(id_vehicle,model,...),另一个表为‘tb_trip’(id_vehicle,dt_start,dt_end,...)。
我无法执行返回每辆车在旅途中的天数的查询,不包括重复的天数(什么意思?在同一天,车辆可以离开1、2、3、…次,然而,我只需要知道车辆在当天离开,而不是它离开的次数[我已经对另一张图表进行了这个查询,它非常安静])。
示例:
结核病车辆
| 识别车辆|模型|
| - -----|- -----|
| 1|雪佛兰科鲁兹|
| 2|雪佛兰Sonic|
tb跳闸
| 识别车辆|dt_start| dt_end|
| - -----|- -----|- -----|
| 1| 2019 -05- 06| 2019 -05- 06|
| 1| 2019 -05- 06| 2019 -05- 06|
| 1| 2019 -05- 06| 2019 -08- 21 00:00:00|
| 2| 2019 -05- 06| 2023年6月6日|
OBS:在这个例子中,我忽略了小时和分钟
预期结果:
| 识别车辆|模型|qtd_天|
| - -----|- -----|- -----|
| 1|雪佛兰科鲁兹|4|
| 2|雪佛兰Sonic| 2|
我能够使用PL/SQL计算每辆车的单个统计数据。但是我只需要使用SQL来执行这个查询。
该系统在APEX开发。
5条答案
按热度按时间snz8szmq1#
这里有一个选择
样本数据:
查询从这里开始;
temp
CTE列出开始日期和结束日期之间的所有日期;最后一个查询计算每辆车的不同日期(沿着连接到tb_vehicle
表):swvgeqrz2#
下面是Littlefoot的想法,其中有一个稍微不同的查询。我使用标准的递归CTE首先从行生成单个日期。然后我计算每辆车的不同天数。最后,我把这个结果加入车辆表。您可能会发现这个查询更容易理解。
演示:https://dbfiddle.uk/paJKama3
qyuhtwio3#
生成所有日期的列表,然后查找不同的日期,这很容易编写代码,但如果您的范围很大,那么它的成本就会很高。
相反,您可以合并范围(通过
UNPIVOT
计算日期,然后使用MATCH_RECOGNIZE
合并重叠),然后使用算术计算范围的大小并为每个车辆进行聚合:其中,对于样本数据:
输出:
| ID_车辆|型号|QTD_天|
| - -----|- -----|- -----|
| 1|雪佛兰科鲁兹|4|
| 2|雪佛兰Sonic| 2|
| 3|德罗宁|二九六三九四二|
fiddle
8tntrjer4#
希望下面的代码可以满足你的需求:
cetgtptt5#
使用MATCH_RECOGNIZE的更简单版本