Redian新闻
>
【TED】Video “成年人能从孩子那里学到什么?
avatar
【TED】Video “成年人能从孩子那里学到什么?# Education - 教育学
w*m
1
有那位大侠知道这道题怎么做吗?
create table Rating(reviewerID int, movieID int, ratingScore int, ratingDate
date);
insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');
insert into Rating values(208, 104, 3, '2011-01-02');
-- For all cases where the same reviewer rated the same movie
-- twice and gave it a higher rating the second time.
avatar
B*g
3
90%+数据库版的SQL问题可以用partition by解决

ratingDate

【在 w********m 的大作中提到】
: 有那位大侠知道这道题怎么做吗?
: create table Rating(reviewerID int, movieID int, ratingScore int, ratingDate
: date);
: insert into Rating values(201, 101, 2, '2011-01-22');
: insert into Rating values(201, 101, 4, '2011-01-27');
: insert into Rating values(202, 106, 4, null);
: insert into Rating values(203, 103, 2, '2011-01-20');
: insert into Rating values(203, 108, 4, '2011-01-12');
: insert into Rating values(203, 108, 2, '2011-01-30');
: insert into Rating values(204, 101, 3, '2011-01-09');

avatar
T*U
5
let me try:
select * from Rating a Join
(select reviewId, movieId, max(ratingScore) maxSalary,
max(ratingDate) latestDate
from Rating group by reviewId, movieID
having count(*)=2 and avg(ratingScore)using(reviewId,moveieId)
where ratingScore = maxSalary and ratingDate = latestDate;

ratingDate

【在 w********m 的大作中提到】
: 有那位大侠知道这道题怎么做吗?
: create table Rating(reviewerID int, movieID int, ratingScore int, ratingDate
: date);
: insert into Rating values(201, 101, 2, '2011-01-22');
: insert into Rating values(201, 101, 4, '2011-01-27');
: insert into Rating values(202, 106, 4, null);
: insert into Rating values(203, 103, 2, '2011-01-20');
: insert into Rating values(203, 108, 4, '2011-01-12');
: insert into Rating values(203, 108, 2, '2011-01-30');
: insert into Rating values(204, 101, 3, '2011-01-09');

avatar
j*n
6
--Good for MSSQLSRV2K5 and higher versions
;WITH Rating (reviewerID , movieID , ratingScore , ratingDate)
AS
(
SELECT 201, 101, 2, '2011-01-22'
UNION ALL
SELECT 201, 101, 4, '2011-01-27'
UNION ALL
SELECT 202, 106, 4, null
UNION ALL
SELECT 203, 103, 2, '2011-01-20'
UNION ALL
SELECT 203, 108, 4, '2011-01-12'
UNION ALL
SELECT 203, 108, 2, '2011-01-30'
UNION ALL
SELECT 204, 101, 3, '2011-01-09'
UNION ALL
SELECT 205, 103, 3, '2011-01-27'
UNION ALL
SELECT 205, 104, 2, '2011-01-22'
UNION ALL
SELECT 205, 108, 4, null
UNION ALL
SELECT 206, 107, 3, '2011-01-15'
UNION ALL
SELECT 206, 106, 5, '2011-01-19'
UNION ALL
SELECT 207, 107, 5, '2011-01-20'
UNION ALL
SELECT 208, 104, 3, '2011-01-02'
UNION ALL
SELECT 208, 104, 3, '2011-01-02'
),
-- For all cases where the same reviewer rated the same movie twice and gave
it a higher rating the second time.
TwiceRating
AS (
SELECT reviewerID, movieID
FROM Rating
Group by reviewerID, movieID
Having Count(1) = 2
),
RatingList
AS (
SELECT A.*, ROW_NUMBER() OVER (PARTITION BY A.reviewerID, A.movieID ORDER BY
A.ratingDate ASC) AS RN
FROM Rating A JOIN TwiceRating B ON A.reviewerID = B.reviewerID AND A.
movieID = B.movieID
)
SELECT A.reviewerID, A.movieID, B.ratingScore AS the2ndHigherRatingScore
FROM RatingList A JOIN RatingList B
ON A.reviewerID = B.reviewerID AND A.movieID = B.movieID AND A.RN = 1 AND B.
RN = 2
WHERE A.ratingScore < B.ratingScore

【在 B*****g 的大作中提到】
: 90%+数据库版的SQL问题可以用partition by解决
:
: ratingDate

avatar
j*n
7
syntax error...

maxSalary,
and

【在 T****U 的大作中提到】
: let me try:
: select * from Rating a Join
: (select reviewId, movieId, max(ratingScore) maxSalary,
: max(ratingDate) latestDate
: from Rating group by reviewId, movieID
: having count(*)=2 and avg(ratingScore): using(reviewId,moveieId)
: where ratingScore = maxSalary and ratingDate = latestDate;
:
: ratingDate

avatar
T*U
8
thx, modified. does it work now?

【在 j*****n 的大作中提到】
: syntax error...
:
: maxSalary,
: and

avatar
j*n
9
yap

【在 T****U 的大作中提到】
: thx, modified. does it work now?
avatar
B*g
10
how to handle ratingDate NULL?
how to handle equal ratingDate?

ratingDate

【在 w********m 的大作中提到】
: 有那位大侠知道这道题怎么做吗?
: create table Rating(reviewerID int, movieID int, ratingScore int, ratingDate
: date);
: insert into Rating values(201, 101, 2, '2011-01-22');
: insert into Rating values(201, 101, 4, '2011-01-27');
: insert into Rating values(202, 106, 4, null);
: insert into Rating values(203, 103, 2, '2011-01-20');
: insert into Rating values(203, 108, 4, '2011-01-12');
: insert into Rating values(203, 108, 2, '2011-01-30');
: insert into Rating values(204, 101, 3, '2011-01-09');

avatar
w*m
11
Nice。 看来一步还是做的出来的。包子已发。谢谢。

b

【在 T****U 的大作中提到】
: let me try:
: select * from Rating a Join
: (select reviewId, movieId, max(ratingScore) maxSalary,
: max(ratingDate) latestDate
: from Rating group by reviewId, movieID
: having count(*)=2 and avg(ratingScore): using(reviewId,moveieId)
: where ratingScore = maxSalary and ratingDate = latestDate;
:
: ratingDate

avatar
T*U
12
客气,其他两个mm说得也有道理的

【在 w********m 的大作中提到】
: Nice。 看来一步还是做的出来的。包子已发。谢谢。
:
: b

avatar
w*m
13
这个是stanford database公开课上的一道习题,要用ANSI SQL(SQLite)做一个query。
像北京大侠考虑的database design好像还没涉及。

【在 B*****g 的大作中提到】
: how to handle ratingDate NULL?
: how to handle equal ratingDate?
:
: ratingDate

avatar
B*g
14
他们竟然用SQLite教?还不如直接上小布老师的SQL视屏呢。另外ANSI SQL和SQLite有
什么关系?

【在 w********m 的大作中提到】
: 这个是stanford database公开课上的一道习题,要用ANSI SQL(SQLite)做一个query。
: 像北京大侠考虑的database design好像还没涉及。

avatar
T*U
15
小布老师讲得挺好的,除了英语发音不如stanford

【在 B*****g 的大作中提到】
: 他们竟然用SQLite教?还不如直接上小布老师的SQL视屏呢。另外ANSI SQL和SQLite有
: 什么关系?

avatar
T*U
16
stanford讲得好象很杂, 每个东西都不细,就没有仔细听

【在 w********m 的大作中提到】
: 这个是stanford database公开课上的一道习题,要用ANSI SQL(SQLite)做一个query。
: 像北京大侠考虑的database design好像还没涉及。

avatar
B*g
17
假设(其实不用假设,必须考虑)score和data都需要考虑NULL和equals,写一个SQL,
呵呵

【在 T****U 的大作中提到】
: 小布老师讲得挺好的,除了英语发音不如stanford
avatar
w*m
18
stanford讲的蛮好,很多题跟很多面试题很像。
SQL Server做这道题偶觉得pivot一下就好了。标准SQL做还真是不容易。
小布老师是什么课程,有链接吗?

【在 B*****g 的大作中提到】
: 他们竟然用SQLite教?还不如直接上小布老师的SQL视屏呢。另外ANSI SQL和SQLite有
: 什么关系?

avatar
T*U
19
boobooke.com

【在 w********m 的大作中提到】
: stanford讲的蛮好,很多题跟很多面试题很像。
: SQL Server做这道题偶觉得pivot一下就好了。标准SQL做还真是不容易。
: 小布老师是什么课程,有链接吗?

avatar
B*g
20
什么叫“score为null就不返回了”?
date相等的时候多了去了,double click submit button的人有的是

【在 T****U 的大作中提到】
: boobooke.com
avatar
T*U
21
score 为null, 就没法比较,本来就不应该有值返回,这点sql逻辑和本来的工作逻辑是
一样的,不影响输出结果。一定要管,那就加个nvl什么的,不过那样null的会相等,和
原来的null含义也不完全一样。我觉得不加比较好。
date可以加一个min(date)
【在 B*****g 的大作中提到】
: 什么叫“score为null就不返回了”?
: date相等的时候多了去了,double click submit button的人有的是

avatar
w*m
22
同意ThinkU。 要比较的数值null的时候,SQL就不理了,神也没有办法,呵呵。
avatar
w*m
23
两个日期一样的时候,就只能比较hour, minute, second
avatar
B*g
24
搞来搞去,实际上用agg扩展性比较差,而ana在这方面是比较灵活的,特殊情况都是小
改就行了,看看俺这个,大家讨论一下效率如何,哈哈,就是要证明能用partition by
解决
WITH tmp AS (
SELECT r.*,
COUNT(*) OVER (PARTITION BY reviewerID, movieID) review_count,
RANK() OVER (PARTITION BY reviewerID, movieID ORDER BY RATINGDate)
review_date_order,
RANK() OVER (PARTITION BY reviewerID, movieID ORDER BY RATINGScore
ASC NULLS FIRST) review_score_order
FROM rating r)
SELECT t.reviewerID, t.movieID
FROM tmp t
WHERE t.review_count = 2
AND t.review_date_order = 2
AND t.review_score_order = 2

辑是

【在 T****U 的大作中提到】
: score 为null, 就没法比较,本来就不应该有值返回,这点sql逻辑和本来的工作逻辑是
: 一样的,不影响输出结果。一定要管,那就加个nvl什么的,不过那样null的会相等,和
: 原来的null含义也不完全一样。我觉得不加比较好。
: date可以加一个min(date)
avatar
B*g
25
嘿嘿

【在 w********m 的大作中提到】
: 同意ThinkU。 要比较的数值null的时候,SQL就不理了,神也没有办法,呵呵。
avatar
T*U
26
MM,你这里date/score为null, 或相等的情况不好办吧
score一个为null, 一个为3,难道输出?这个业务逻辑不知道对不对?

by

【在 B*****g 的大作中提到】
: 搞来搞去,实际上用agg扩展性比较差,而ana在这方面是比较灵活的,特殊情况都是小
: 改就行了,看看俺这个,大家讨论一下效率如何,哈哈,就是要证明能用partition by
: 解决
: WITH tmp AS (
: SELECT r.*,
: COUNT(*) OVER (PARTITION BY reviewerID, movieID) review_count,
: RANK() OVER (PARTITION BY reviewerID, movieID ORDER BY RATINGDate)
: review_date_order,
: RANK() OVER (PARTITION BY reviewerID, movieID ORDER BY RATINGScore
: ASC NULLS FIRST) review_score_order

avatar
B*g
27
这就是显示一下可调,具体NULL first还是last可以改动

【在 T****U 的大作中提到】
: MM,你这里date/score为null, 或相等的情况不好办吧
: score一个为null, 一个为3,难道输出?这个业务逻辑不知道对不对?
:
: by

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。