棘手的SQL练习

时间:2013-10-09 05:50:15

标签: sql postgresql subquery

以下是数据库说明:

  

公司(ID_comp,名称)

     

旅行(trip_no,id_comp,plane,town_from,town_to,time_out,time_in)

     

乘客(ID_psg,姓名)

     

Pass_in_trip(trip_no,date,ID_psg,place)

  • 公司表有公司的ID和名称,用于运送乘客。
  • 旅行表有关于旅行的信息:旅行号码,公司ID,飞机类型,出发城市,到达城市,出发时间和到达时间。
  • 乘客表中有乘客的身份证和乘客的姓名。
  • Pass_in_trip表包含有关航班的信息:旅行编号,出发日期(日期),旅客身份证及其在航班期间的位置。

我们应该注意到,

  • 任何旅行每天都在完成;航班的持续时间少于一个日历日(24小时);
  • 时间和日期被认为是相对一个时区;
  • 出发时间和到达时间在一分钟之内;
  • 可能有相同名字的乘客(例如,布鲁斯威利斯);
  • 飞行途中的地方是一个数字后跟一个字母;数字按字母顺序定义行号,字母(a-d) - 行中的位置(从左到右);
  • 关系和限制显示在数据模式中。

以下是问题:

查找在同一座位上飞行不止一次的不同乘客的姓名。

我试过这个查询

select name  from (
select id_psg, count(name) as total from (
select a.id_psg, name, date,place from passenger a join
pass_in_trip b on a.id_psg=b.id_psg order by a.id_psg, place
) as t1
group by t1.id_psg
) as a join passenger b on a.id_psg = b.id_psg 
join pass_in_trip c on a.id_psg=c.id_psg
where total > 1
group by name,place
having count(place) >=2 
order by name,place;

但它说:

Wrong
Your query produced correct result set on main database, but it failed test on second, checking database
* Wrong number of records (more by 8)
  • 这是来自SQL-RU btw。
  • 的练习

3 个答案:

答案 0 :(得分:1)

SELECT
    p.name
FROM
    passenger AS p
  JOIN
    pass_in_trip AS pt
      ON p.id_psg = pt.id_psg
GROUP BY 
    p.id_psg, p.pame
HAVING
    COUNT(DISTINCT pt.place) < COUNT(*) ;

答案 1 :(得分:0)

select name, place, COUNT(name)as "no of trips" 
from Passenger p 
join Pass_in_trip pt
    on p.ID_psg=pt.ID_psg join Trip t
    on pt.trip_no=t.trip_no
group by name, place
having count(name) > 1  

答案 2 :(得分:0)

DataFrame