Learning mysql by leetcoe : No. 262 Trips and Users

题目

goto: leetcode 262
难度: Hard

解答

SELECT Request_at AS Day, ROUND(COUNT(IF(Status != 'completed', TRUE, NULL)) / COUNT(*), 2) 'cancellation Rate'
FROM Trips WHERE (Request_at BETWEEN '2013-10-01' AND "2013-10-03") AND Client_Id IN
(SELECT Users_Id FROM users WHERE Banned = 'No') GROUP BY Request_at ASC;

FBI Warning

这道题的描述是有问题的,leetcode上的题目也像是被更改过. “Write a SQL query to find the cancellation rate of requests made by unbanned users”, user 应该包含partner, driver,client. 但是好像如果只处理"unbanned client" 也能通过.(提交记录里多数都是处理unbanned users)

注解

enum

类似C的枚举, 但是很多人认为mysql 中最好不要使用enum. 具体原因可baidu 之.

between

expr BETWEEN min AND max

[min,max], 两边都是闭区间

count

count(column) ---- 不统计null;
count(*) -------------- 统计null
count(distinct column) — 返回指定列的不同值的记录数,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。
e.g.:
统计sub_type='REFUND_FEE’ 的记录数:

方法一.select count(sub_type) from t where t.sub_type='REFUND_FEE’;
方法二.select sum(if( B.sub_type='REFUND_FEE’ ,1,0)) from t;
方法三.select count(B.sub_type=‘REFUND_FEE’ or null) from t;

if

IF(expr1,expr2,expr3)
如果 expr1 是TRUE, IF()的返回值为expr2; 否则返回值则为 expr3。

IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

round || truncate

在mysql中,round函数用于数据的四舍五入,它有两种形式:

  • round(x,d) ,x指要处理的数,d是指保留几位小数
    TRUNCATE(x,y)函数返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y设为负数,则截去(归零)x小数点左起第y位开始后面所有低位的值。
  • round(x) ,其实就是round(x,0),也就是默认d为0;

ROUND(x,y)函数在截取值的时候会四舍五入,而TRUNCATE(x,y)函数直接截取值,并不进行四舍五入。

in

列表项选择. where column [NOT] in (…)

更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)

关于引号

  1. mysql的字段名、表名通常不需要加任何引号,如果非要加上引号,必须加反引号``(避免与系统关键字冲突);
  2. mysql的别名可以不加引号,如果加引号,单引号和双引号以及反引号都可以;
  3. 单引号和双引号都可以表示字符串;

大小写

linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;
如果有更多的需求, 也可以自己设置是否大小写敏感.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个代码片段是使用Pandas库在Python中进行数据合并(merge)操作。`trips`和`users`似乎是在Python的pandas DataFrame对象,`merge`函数用于根据某些列将两个DataFrame连接起来。`how='left'`表示执行左连接(left join),保留左DataFrame(`trips`)的所有行,如果右DataFrame(`users`)中没有匹配的行,则结果中对应列的值为NaN。 错误分析: 1. 如果`trips`和`users`对象未定义或不是pandas DataFrame,这将引发`NameError`。 2. 如果试图连接的键(on或by参数)不存在于两个DataFrame中,这将导致`KeyError`。 3. 如果`users`的某个列在`trips`中没有匹配,因为是左连接,`users`的那些行将在结果中缺少数据,而不是引发错误。 4. 如果`how`参数不是'left', 'inner', 'right', 'outer'之一,将导致`ValueError`。 修复后的完整代码示例(假设`trips`和`users`已经定义为pandas DataFrame,并且它们有一个共同的键列`user_id`): ```python import pandas as pd # 假设tripsusers数据如下 trips = pd.DataFrame({ 'trip_id': [1, 2, 3, 4], 'user_id': [1, 2, 1, 3], # ...其他列... }) users = pd.DataFrame({ 'user_id': [1, 2, 4, 5], 'user_name': ['Alice', 'Bob', 'Charlie', 'Dave'], # ...其他列... }) # 使用 user_id 进行左连接 merged_df = trips.merge(users, on='user_id', how='left') # 现在merged_df包含了trips的所有行,如果有匹配的user_id,user_name列有值,否则为NaN ``` 注意:实际运行这段代码前,请确保`trips`和`users`数据符合上述设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值