首页 > 试题广场 >

有如下两张表格Metro,Orders,表格结构如下

[问答题]

有如下两张表格MetroOrders,表格结构如下

Metro

Name

Lng

Lat

中关村地铁站

121.442132

24.22421

望京地铁站

121.0284938

24.09839

。。。。

。。。。

。。。。

 

Orders

Id

Lng

Lat

Time

1

121.442132

24.22421

2017-07-01 22:11:14

2

121.0284938

24.09839

2017-07-01 22:11:15

。。。。

。。。。

。。。。

 

 

Metro表示地铁站列表,包括地铁站站名及经纬度坐标等字段。Oders表示订单表,包括开锁经纬度坐标及开锁时间等字段。 请统计每个地铁站周边1km范围内的订单,找出71日早上7:00-9:00期间 出行量最大的前10个地铁站。(先验知识:经度和纬度的小数点后两位相等即表示在一公里范围内)

select name, count(*) num from 
Metro join  Orders on  
truncate(Metro.Lng,2) = truncate(Orders.Lng,2) and truncate(Metro.Lat,2) = truncate(Orders.Lat,2)  
and Time between '2017-07-01 07:00:00' and '2017-07-01 09:00:00'
group by name order by num desc limit 10
发表于 2018-07-31 23:30:04 回复(2)
select name, count(*) num from 
Metro join  Orders on  
truncate(Metro.Lng,-2) = truncate(Orders.Lng,-2) and truncate(Metro.Lat,-2) = truncate(Orders.Lat,-2) #只需要截取小数点后两位即可 
and Time between '2017-07-01 07:00:00' and '2017-07-01 09:00:00'
group by name order by num desc limit 10
发表于 2018-08-22 22:21:43 回复(0)
select m.Name as subway, count(*) as order_count from Metro as m inner join Orders as o on round(m.Lng,2)=round(o.Lng,2) and round(m.Lat,2)=round(o.Lat,2) where Time between '2017-07-01 7:00;00‘ and '2017-07-01 9:00;00‘ order by order_count desc limit 0,10
发表于 2020-03-21 11:32:40 回复(0)
select top 10 a.Name,count(*) num
from Metro a inner join Orders b
on round(a.Lng,2,1)=round(b.Lng,2,1) and round(a.Lat,2,1)=round(b.Lat,2,1)--注意这里round没有舍入
and b.Time between '2017-07-01 07:00:00'and '2017-07-01 09:00:00'
group by name 
order by num desc 

编辑于 2020-03-16 15:38:24 回复(0)
select tmp.name
         dense_rank() over(order by tmp.id_num desc) as ranks
from
(select t1.name
          ,count(t2.id) as id_num
from
(select name
         ,round(lng)  as mt_lng
         ,round(lat)  as mt_lat
from metro)t1
left join
(
select id
         ,round(lng)  as od_lng
         ,round(lat)  as od_lat
from orders
where time between '2017-07-01 07:00:00' and '2017-07-01 09:00:00' 
)t2
on t1.mt_lng = t2.od_lng and t1.mt_lat = t2.od_lat
group by t1.name)tmp
where ranks<=10
发表于 2019-08-27 10:57:48 回复(0)
select name,count(distinct id) as order_num
from 
(select name,truncate(lng,2) as lng ,truncate(lat,2) as lat 
 from Metro ) M
join 
(select id ,truncate(lng,2) as lng,truncate(lat,2) as lat
 from orders
 where time between '2017-07-01 07:00:00' and '2017-07-01 09:00:00' ) O
on M.lng = O.lng and M.lat = O.lat
group by name
order by order_num desc limit 10;

编辑于 2019-08-18 14:02:52 回复(0)
牛友们看看对不对,互助互助~
select Name,count(1) as order_num from 
((select Name,substring(Lng,locate('.',Lng),3) as Lng, substring(Lat,locate('.',Lng),3) as Lat from Metro) a 
join
(select substring(Lng,locate('.',Lng),3) as Lng, substring(Lat,locate('.',Lng),3) as Lat,Time from Orders 
where Time between '2017-07-01 07:00:00' and '2017-07-01 09:00:00') b
on a.Lng = b.Lng and a.Lat = b.Lat) t1
group by Name order by order_num desc limit 10;
发表于 2018-08-31 17:24:34 回复(3)
import pandas as pd
Metro = pd.read_csv('Metro')
Ordes = pd.read_csv('Orders')

Metro['Lng'] = Metro['Lng'].apply(lambda x:str(x)[0:(x.index('.')+3)])
Metro['Lat'] = Metro['Lat'].apply(lambda x:str(x)[0:(x.index('.')+3)])
Ordes['Lng'] = Ordes['Lng'].apply(lambda x:str(x)[0:(x.index('.')+3)])
Ordes['Lat'] = Ordes['Lat'].apply(lambda x:str(x)[0:(x.index('.')+3)])
table = pd.merge(Ordes,Metro,on=['Lng','Lat'])
table['day'] = table['Time'].apply(lambda x:str(x).split(' ')[0][-5:])
table['time'] = table['Time'].apply(lambda x:str(x).split(' ')[1][0:5])
df = table[['Name','day','time']].copy()
df = df[df['day'] == '07-01']
df = df[(df['time']>='07:00') & (df['time']<='09:00') ]
#对地铁站名字进行分组
df.groupby('Name').count().sort_values(by='day',ascending=False).head(10)

发表于 2018-07-27 10:27:14 回复(0)