📣 独立日限时特惠: VIP通行证立减$68
查看: 2528| 回复: 17
跳转到指定楼层
上一主题 下一主题
收起左侧

請教一道SQL題

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
樓主最近在準備SQL的面試,忽然想到之前面過的一道題,但是記不清另外一種方法怎麼寫了。總之大概意思是求每個event type最近一天的數值是多少:
Event_type        Date        Num
A                        8/1           60
A                        8/2          45
B                        8/1           21
B                        8/2           11
A                        8/3           55
所以最後結果應該是A對應8/3的55, B對應8/2 的11。樓主知道可以用row number來求。但是我記得有一種更簡單的方法,好像用where date等於一個東西。所以如果不用row number跟join,要怎麼寫呢? 希望各位大神幫忙一下!

上一篇:请问:无人驾驶或者机器人方面的高人,IMU的使用
下一篇:有人在做GAN或者domain adaption吗?
推荐
李浩泉 2020-8-21 13:15:16 | 只看该作者
全局:
本帖最后由 李浩泉 于 2020-8-21 13:27 编辑

PostgreSQL / MySQL 特有的解法:(2颗星,考察你是否了解 PostgreSQL / MySQL 和 SQL Server 的区别,实际ETL中不推荐,执行效率很低)

  1. SELECT Event_type,
  2.        Date,
  3.        Num
  4. FROM EVENT
  5. WHERE (Event_type,Date) IN
  6.                       ( SELECT Event_type,MAX(Date)
  7.                         FROM EVENT
  8.                         GROUP BY Event_type )
复制代码



SQL Server 传统解法一:(3颗星)

  1. SELECT Event_Type,
  2.        Date,
  3.        Num
  4. FROM (
  5.     SELECT Event_Type,
  6.            Date,
  7.            Num,
  8.            DENSE_RANK() OVER(PARTITION BY Event_Type ORDER BY Date DESC) AS RK
  9.     FROM Event) T
  10. WHERE RK = 1
复制代码



SQL Server 传统解法二:(3.5颗星)

  1. WITH CTE AS
  2. (
  3. SELECT Event_Type,MAX(Date) AS DATE FROM Event GROUP BY Event_Type
  4. )

  5. SELECT E.Event_Type,
  6.        E.Date,
  7.        E.Num
  8. FROM Event E INNER JOIN CTE ON E.Event_Type = CTE.Event_Type AND E.Date = CTE.DATE
  9. ORDER BY 1 ASC
复制代码


SQL Server 传统解法三:(4颗星)

  1. WITH CTE AS
  2. (
  3. SELECT Event_Type,MAX(Date) AS DATE FROM Event GROUP BY Event_Type
  4. )

  5. SELECT E.Event_Type,
  6.        E.Date,
  7.        E.Num
  8. FROM Event E,CTE
  9. WHERE E.Event_Type = CTE.Event_Type AND E.Date = CTE.DATE
  10. ORDER BY 1 ASC
复制代码



SQL Server 传统解法四:(2.5颗星)

  1. SELECT Event_type,
  2.        Date,
  3.        Num
  4. FROM EVENT E1
  5. WHERE Date = (SELECT MAX(Date)
  6.                         FROM EVENT E2
  7.                         WHERE E1.Event_type = E2.Event_type)
  8. ORDER BY 1 ASC
复制代码



评分

参与人数 6大米 +9 收起 理由
amoramor + 1 欢迎分享你知道的情况,会给更多积分奖励!
sagethyme + 3 给你点个赞!
citycity0616 + 1 给你点个赞!
Sherly277 + 2 给你点个赞!
Fake/Random + 1 赞一个

查看全部评分

回复

使用道具 举报

全局:
where (event_type, date) in (select event_type, max(date) from table group by event_type) 大概这个意思?不太确定有没有语法错误

评分

参与人数 3大米 +4 收起 理由
Fake/Random + 1 赞一个
rongmeimei + 1 赞一个
haoguoxuan + 2 给出正确答案也没人理,加个米安慰一下吧!

查看全部评分

回复

使用道具 举报

推荐
lllkx9220 2020-8-20 17:41:36 | 只看该作者
全局:
可以用correlated subquery来做

SELECT Event_type,
             Num
FROM table OUTER
WHERE Date = (SELECT MAX(Date)
                        FROM table INNER
                        WHERE INNER.Event_type = OUTER.Event_type)

评分

参与人数 2大米 +2 收起 理由
unclewillie + 1 赞一个
charlatteD + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
 楼主| rongmeimei 2020-8-20 15:19:37 来自APP | 只看该作者
全局:
colospring 发表于 2020-08-20 00:11:51
where (event_type, date) in (select event_type, max(date) from table group by event_type) 大概这个意思?不太确
就是這個意思。謝謝🙏🙏
回复

使用道具 举报

🔗
sdszilong 2020-8-20 16:49:54 | 只看该作者
全局:
这样用where去check的话,会很慢啊。
应该用一张subquery去搞一下with test as (select *, rank() over(partition by event_type order by date desc) as xxx from table)
然后在 select * except xxx from test where xxx = 1就差不多了
回复

使用道具 举报

🔗
 楼主| rongmeimei 2020-8-20 23:06:29 来自APP | 只看该作者
全局:
sdszilong 发表于 2020-08-20 01:49:54
这样用where去check的话,会很慢啊。
应该用一张subquery去搞一下with test as (select *, rank() over(partition by event_type
怎麼決定哪種方法更快?
row number也要把每個都過一遍⋯
回复

使用道具 举报

🔗
Leilalala 2020-8-21 00:44:43 | 只看该作者
全局:
不知道这样可不可以。。。如果有error的话 估计还是要用where date=(select。。)
select event_type,  max(date), num from xx, group by event_type
回复

使用道具 举报

🔗
sdszilong 2020-8-21 00:52:35 | 只看该作者
全局:
rongmeimei 发表于 2020-8-20 23:06
怎麼決定哪種方法更快?
row number也要把每個都過一遍⋯

额,其实在用的时候,计算速度不是太大的问题。
我的理解是,这个rank里面有partition by啊,所以只会对每个不同的event进行一个rank而已,如果event不是很单一的话,应该会快。
用where (event, date) in select (....)的话,相当于是每个event,date都要去查一张你后面生成的表格,这个cost应该会很大。比这个好一些的是把后面那个select也做成subtable,然后两张表去join就好了。
回复

使用道具 举报

🔗
 楼主| rongmeimei 2020-8-21 01:58:37 来自APP | 只看该作者
全局:
原來如此。我不是很懂cost方面... 當時面這道題的時候我是用row number,但是那個面試官給我展示了where的用法...
回复

使用道具 举报

🔗
P3T3M4 2020-8-21 03:27:24 | 只看该作者
全局:
我还是不凑这热闹了。告辞告辞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表