Redian新闻
>
谈完假钱,来谈谈真钱.
avatar
谈完假钱,来谈谈真钱.# Stock
w*y
1
data science interview那本书里的
一个SQL题目,给一个‘logs’ table, 里面的数据是timestamp和jobID,譬如
timestamp jobID
1 1
2 2
3 1
4 1
5 3
6 2
7 1
8 4
要求是find all the jobIDs that appear at least twice consecutively. ‘
consecutively’是timestamp连续的意思,这个例子里找到的结果就是1
答案提到用variable做是O(n),但是看不懂答案,完全不会用sql的variable的语法啊
,有什么好的tutorial网页推荐嘛? 也不理解为什么这样子是O(n), 是不是因为
subquery不需要做join?
用local variable的答案是这样子的
SELECT jobID, @counter := IF(@prev = jobID, @counter +1, 1) As cnt, @prev :=
jobID
FROM logs y, (SELECT @counter := 1, @prev = NULL) tmp
这是里面的subquery,外面一层就是select 。。 where cnt >=2
avatar
c*u
2
My opinion, now is NOT the perfect time into the storm.
avatar
w*y
3
我是完全照搬的答案啊,这个书里貌似有typo,那个FROM logs y, (SELECT @counter
:= 1, @prev = NULL) tmp
我不太理解,而且这个alias tmp似乎也没用
还有一个不清楚的地方就是在select jobID, @counter..., @prev 那里更新@counter/
@prev, 虽然我大概可以猜出来这个是干嘛,但是不知道对应的sql 知识点在哪里,有
好的tutorial推荐嘛?
多谢啦!
avatar
w*y
4
把答案拍了一下,见附件
avatar
c*u
5
select distinct a.jobID
from logs as a, logs as b
where a.timestamp - b.timestamp = 1 and a.jobID = b.jobID
;
avatar
w*y
6
多谢!书里也给了这个用join的答案,不过说join是O(n^2)
用local variable是 O(n)
我对sql了解仅限于简单的select/join, 用variable的完全不懂 //汗
再问一下复杂度的问题,如果有的问题可以用subquery 避免join,是不是也是O(n)?

【在 c****u 的大作中提到】
: select distinct a.jobID
: from logs as a, logs as b
: where a.timestamp - b.timestamp = 1 and a.jobID = b.jobID
: ;

avatar
a*g
7
我一直搞不明白为什么很多人喜欢用隐式JOIN,并且把JOIN 条件放到WHERE clause里?
这是哪本书里教的啊?

【在 c****u 的大作中提到】
: select distinct a.jobID
: from logs as a, logs as b
: where a.timestamp - b.timestamp = 1 and a.jobID = b.jobID
: ;

avatar
a*g
8
FROM logs y, (SELECT @counter
: := 1, @prev = NULL) tmp
这里我也没看懂啊,这尼玛是oracle的语法吗?看上去像是做了个隐式join。能不能发
个sql server 版的来?

counter
counter/

【在 w***y 的大作中提到】
: 我是完全照搬的答案啊,这个书里貌似有typo,那个FROM logs y, (SELECT @counter
: := 1, @prev = NULL) tmp
: 我不太理解,而且这个alias tmp似乎也没用
: 还有一个不清楚的地方就是在select jobID, @counter..., @prev 那里更新@counter/
: @prev, 虽然我大概可以猜出来这个是干嘛,但是不知道对应的sql 知识点在哪里,有
: 好的tutorial推荐嘛?
: 多谢啦!

avatar
w*y
9
FROM logs y, (SELECT @counter := 1, @prev = NULL) tmp
这个地方貌似不是join, 比价奇怪的用select去做set的事情,我看mysql的tutorial
也这
样写
https://dev.mysql.com/doc/refman/5.5/en/assignment-operators.html#operator_
assign-value
我也不知道为啥写到这里,但是我试过,把这一句挪到整个select的前面,就完全当作
一个初始化来用,完全不影响结果的。
我对sql很不熟啊,不知道sql server版本咋做,这个完全就是看书上答案的
avatar
w*y
10
我还遇到另外一个sql题,是看面经里的。也不会做 //汗
SQL:一个学生enrollment table,里面的数据是
studentID, courseID, grade
求每个学生的最好成绩,和对应的courseID。如果highest grade有duplicate怎么办?
这个好像涉及到对每个group进行rank,然后取top K, 也是一种常见的题目。 怎么做
呢? 我在网上搜的答案,有的SQL支持 类似row_number() 这种function,好像mysql
是没有的,需要自己定义local variable 去做。 我想不明白有duplicate怎么处理,
是不是写一个case 来判断? 今天现学的case statement,还有点搞不定
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。