首页 > 解决方案 > SQL 如何按地区名称对其进行 GROUP,并获取所有行程的数量?甲骨文数据库

问题描述

解决的问题:返回2018年行程出发站区域名称的次数和平均行程长度(以秒为单位)。如何按地区名称对其进行分组,并获取所有行程的数量? 甲骨文数据库

询问

SELECT  r.name,r.region_id,t.start_date, ((END_DATE - START_DATE)*24*3600)interval_sec
    FROM stations_info si
    LEFT OUTER JOIN regions r
    ON si.region_id = r.region_id
    JOIN trips t
    ON si.station_id = t.start_station_id
    WHERE start_date > TO_DATE('18/01/01') 
    ORDER BY  t.start_date ASC;

结果

     NAME    Reg_ID Start_Date  Interval_sec
     San Jose   5   18/01/01    145
San Francisco   3   18/01/01    1942,999999999999999999999999999999999998
San Francisco   3   18/01/01    1867
San Francisco   3   18/01/01    1140,999999999999999999999999999999999998
San Francisco   3   18/01/01    1452,000000000000000000000000000000000004
San Francisco   3   18/01/01    714
San Francisco   3   18/01/01    1209,000000000000000000000000000000000004
San Francisco   3   18/01/01    474
     Oakland    12  18/01/01    296
San Francisco   3   18/01/01    587

第一张表:地区

 REGION_ID NAME                      
         3 San Francisco             
         5 San Jose                  
        12 Oakland                   
        13 Emeryville                
        14 Berkeley                  
        23 8D  

第二个表包括列:

STATION_ID
NAME
SHORT_NAME
REGION_ID
RENTAL_METHODS
CAPACITY
EXTERNAL_ID
RENTAL_URL
EIGHTD_HAS_KEY_DISPENSER
HAS_KIOSK
STATION_GEOM

第三张表包括列:

TRIP_ID
START_DATE
START_STATION_ID
END_DATE
END_STATION_ID
BIKE_NUMBER
ZIP_CODE
SUBSCRIBER_TYPE
C_SUBSCRIPTION_TYPE
MEMBER_BIRTH_YEAR
MEMBER_GENDER
BIKE_SHARE_FOR_ALL_TRIP

标签: sqloraclejoingroup-bycount

解决方案


你的查询看起来很不错。您可以将其转换为聚合查询,如下所示:

select  
    r.name,
    r.region_id,
    sum(end_date - start_date)*24*60*60 interval_sec  -- aggregate function
from stations_info si
inner join regions r on si.region_id = r.region_id
inner join trips t on si.station_id = t.start_station_id
where t.start_date >= date '2018-01-01' and t.start_date < date '2019-01-01'
group by r.name, r.region_id                          -- group by clause
order by r.name;

旁注:

  • 我建议使用 date litteral ( date '2018-01-01') 而不是依赖数据库或会话 ( TO_DATE('18/01/01'))的默认 nls 设置

  • 我修复了日期的条件,因此它仅在 2018 年过滤

  • 我怀疑你的left joinonregions应该是一个inner join(但如果你需要的话,你可以把它改回来)


推荐阅读