力扣數(shù)據(jù)庫(kù)刷題--關(guān)于連續(xù)那些事兒

關(guān)于連續(xù)問(wèn)題的那些事兒
鏈接:https://leetcode-cn.com/problems/active-users

1. #1454.活躍用戶

寫一個(gè) SQL 查詢, 找到活躍用戶的 id 和 name厚脉。

活躍用戶是指那些至少連續(xù)5 天登錄賬戶的用戶。

返回的結(jié)果表按照 id 排序。

SQL架構(gòu)


Create table If Not Exists Accounts (id int, name varchar(10))

Create table If Not Exists Logins (id int, login_date date)

Truncate table Accounts

insert into Accounts (id, name) values ('1', 'Winston')

insert into Accounts (id, name) values ('7', 'Jonathan')

Truncate table Logins

insert into Logins (id, login_date) values ('7', '2020-05-30')

insert into Logins (id, login_date) values ('1', '2020-05-30')

insert into Logins (id, login_date) values ('7', '2020-05-31')

insert into Logins (id, login_date) values ('7', '2020-06-01')

insert into Logins (id, login_date) values ('7', '2020-06-02')

insert into Logins (id, login_date) values ('7', '2020-06-02')

insert into Logins (id, login_date) values ('7', '2020-06-03')

insert into Logins (id, login_date) values ('1', '2020-06-07')

insert into Logins (id, login_date) values ('7', '2020-06-10')

表結(jié)構(gòu)

表 Accounts:

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id 是該表主鍵。
該表包含賬戶 id 和賬戶的用戶名失都。

表 Logins:

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| login_date | date |
+---------------+---------+
該表無(wú)主鍵, 可能包含重復(fù)項(xiàng)。
該表包含登錄用戶的賬戶 id 和登錄日期. 用戶也許一天內(nèi)登錄多次钢悲。

結(jié)果表格式如下例所示:

Accounts 表:
+----+----------+
| id | name |
+----+----------+
| 1 | Winston |
| 7 | Jonathan |
+----+----------+

Logins 表:
+----+------------+
| id | login_date |
+----+------------+
| 7 | 2020-05-30 |
| 1 | 2020-05-30 |
| 7 | 2020-05-31 |
| 7 | 2020-06-01 |
| 7 | 2020-06-02 |
| 7 | 2020-06-02 |
| 7 | 2020-06-03 |
| 1 | 2020-06-07 |
| 7 | 2020-06-10 |
+----+------------+

Result 表:
+----+----------+
| id | name |
+----+----------+
| 7 | Jonathan |
+----+----------+
id = 1 的用戶 Winston 僅僅在不同的 2 天內(nèi)登錄了 2 次, 所以, Winston 不是活躍用戶.
id = 7 的用戶 Jonathon 在不同的 6 天內(nèi)登錄了 7 次, , 6 天中有 5 天是連續(xù)的, 所以, Jonathan 是活躍用戶.

方法1

select distinct a.id,a.name from accounts a join
(select id,datediff(lead(login_date,4)over(partition by id order by login_date),login_date) as diff
from (select distinct id,login_date from logins) a) c
on a.id=c.id
where c.diff=4
order by id

1.datediff(date1,date2) 返回起始時(shí)間 date1 和結(jié)束時(shí)間 date2 之間的天數(shù)焕阿。返回 date1-date2 后的值。還有一個(gè)timestampdiff() 返回值是正好相反的坷随。
https://blog.csdn.net/liguangix/article/details/80243197
2.lead(arg1, arg2) arg1表示列名房铭,arg2表示向后行偏移量,默認(rèn)為1温眉。 當(dāng)找不到值時(shí)返回null 缸匪。lag 向前,lead 向后类溢。

方法2

select distinct a.id,a.name from accounts a 
join(
select id,login_date,
date_sub(login_date,interval row_number()over(partition by id order by login_date) day) as diff
from (select distinct id,login_date from logins) a)aa
on a.id=aa.id
group by a.id,aa.diff
having count(*)>=5
order by a.id

1.date_sub()函數(shù)從日期減去指定的時(shí)間間隔凌蔬。DATE_SUB(OrderDate,INTERVAL 2 DAY)
2.row_number()12345
dense_rank()122345
rank()1224

2. #180連續(xù)出現(xiàn)的數(shù)字

鏈接:https://leetcode-cn.com/problems/consecutive-numbers
編寫一個(gè) SQL 查詢,查找所有至少連續(xù)出現(xiàn)三次的數(shù)字豌骏。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如龟梦,給定上面的 Logs 表, 1 是唯一連續(xù)出現(xiàn)至少三次的數(shù)字窃躲。

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+

Create table If Not Exists Logs (Id int, Num int)
Truncate table Logs
insert into Logs (Id, Num) values ('1', '1')
insert into Logs (Id, Num) values ('2', '1')
insert into Logs (Id, Num) values ('3', '1')
insert into Logs (Id, Num) values ('4', '2')
insert into Logs (Id, Num) values ('5', '1')
insert into Logs (Id, Num) values ('6', '2')
insert into Logs (Id, Num) values ('7', '2')

方法1

select distinct num as ConsecutiveNums from(
select id,num,
lead(num,1)over(order by id) as lead_1,
lead(num,2)over(order by id) as lead_2
from logs )aa
where aa.lead_1=num and aa.lead_2=num

方法2

select distinct num as ConsecutiveNums from(
select id,num,id+1-row_number()over(partition by num order by id)as diff
from logs)aa
group by num,diff
having count(*)>=3 

力扣給的測(cè)試樣例里邊有一個(gè)序號(hào)從0開(kāi)始的计贰,所以id+1保證不是負(fù)數(shù)

3.# 601. 體育館的人流量

鏈接:https://leetcode-cn.com/problems/human-traffic-of-stadium
編寫一個(gè) SQL 查詢以找出每行的人數(shù)大于或等于 100 且 id 連續(xù)的三行或更多行記錄。返回按 visit_date 升序排列的結(jié)果表蒂窒。
表:Stadium
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| visit_date | date |
| people | int |
+---------------+---------+
visit_date 是表的主鍵
每日人流量信息被記錄在這三列信息中:序號(hào) (id)躁倒、日期 (visit_date)荞怒、 人流量 (people)
每天只有一行記錄,日期隨著 id 的增加而增加

查詢結(jié)果格式如下所示秧秉。
Stadium table:
+------+------------+-----------+
| id | visit_date | people |
+------+------------+-----------+
| 1 | 2017-01-01 | 10 |
| 2 | 2017-01-02 | 109 |
| 3 | 2017-01-03 | 150 |
| 4 | 2017-01-04 | 99 |
| 5 | 2017-01-05 | 145 |
| 6 | 2017-01-06 | 1455 |
| 7 | 2017-01-07 | 199 |
| 8 | 2017-01-09 | 188 |
+------+------------+-----------+

Result table:

id visit_date people
5 2017-01-05 145
6 2017-01-06 1455
7 2017-01-07 199
8 2017-01-09 188

id 為 5褐桌、6、7象迎、8 的四行 id 連續(xù)荧嵌,并且每行都有 >= 100 的人數(shù)記錄。
請(qǐng)注意砾淌,即使第 7 行和第 8 行的 visit_date 不是連續(xù)的啦撮,輸出也應(yīng)當(dāng)包含第 8 行,因?yàn)槲覀冎恍枰紤] id 連續(xù)的記錄汪厨。
不輸出 id 為 2 和 3 的行赃春,因?yàn)橹辽傩枰龡l id 連續(xù)的記錄。

Create table If Not Exists stadium (id int, visit_date DATE NULL, people int)
Truncate table stadium
insert into stadium (id, visit_date, people) values ('1', '2017-01-01', '10')
insert into stadium (id, visit_date, people) values ('2', '2017-01-02', '109')
insert into stadium (id, visit_date, people) values ('3', '2017-01-03', '150')
insert into stadium (id, visit_date, people) values ('4', '2017-01-04', '99')
insert into stadium (id, visit_date, people) values ('5', '2017-01-05', '145')
insert into stadium (id, visit_date, people) values ('6', '2017-01-06', '1455')
insert into stadium (id, visit_date, people) values ('7', '2017-01-07', '199')
insert into stadium (id, visit_date, people) values ('8', '2017-01-09', '188')

方法1

select id,visit_date,people from(
select id,visit_date,people,
lead(people,1)over(order by id) as ld_1,
lead(people,2)over(order by id) as ld_2,
lag(people,1)over(order by id) as lg_1,
lag(people,2)over(order by id) as lg_2
from stadium )aa
where 
aa.people>=100 and (
(aa.ld_1>=100 and aa.ld_2>=100)or(aa.lg_1>=100
and aa.lg_2>=100)or( aa.lg_1>=100 and aa.ld_1>=100))
order by visit_date

這個(gè)和上一道的區(qū)別在于劫乱,上一道只是要求算出連續(xù)的那個(gè)數(shù)织中,這道題要求把所有連續(xù)的行都列出來(lái)。所以這道需要取出每行上下共5行的記錄衷戈,因?yàn)樗蟮挠涗浛赡芪挥谥虚g收尾和末位狭吼。

#603. 連續(xù)空余座位

幾個(gè)朋友來(lái)到電影院的售票處,準(zhǔn)備預(yù)約連續(xù)空余座位脱惰。
你能利用表 cinema 搏嗡,幫他們寫一個(gè)查詢語(yǔ)句,獲取所有空余座位拉一,并將它們按照 seat_id 排序后返回嗎采盒?

seat_id free
1 1
2 0
3 1
4 1
5 1

對(duì)于如上樣例,你的查詢語(yǔ)句應(yīng)該返回如下結(jié)果蔚润。

seat_id
3
4
5
Create table If Not Exists cinema (seat_id int primary key auto_increment, free bool)
Truncate table cinema
insert into cinema (seat_id, free) values ('1', '1')
insert into cinema (seat_id, free) values ('2', '0')
insert into cinema (seat_id, free) values ('3', '1')
insert into cinema (seat_id, free) values ('4', '1')
insert into cinema (seat_id, free) values ('5', '1')

方法

select distinct seat_id
from(
select seat_id,
lead(seat_id,1)over(order by seat_id) as ld1,
lag(seat_id,1)over(order by seat_id) as lg1
from cinema
where free=1)aa
where seat_id=ld1-1 or seat_id=lg1+1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磅氨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫡纠,更是在濱河造成了極大的恐慌烦租,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件除盏,死亡現(xiàn)場(chǎng)離奇詭異叉橱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)者蠕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門窃祝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人踱侣,你說(shuō)我怎么就攤上這事粪小〈蠡牵” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵探膊,是天一觀的道長(zhǎng)杠愧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逞壁,這世上最難降的妖魔是什么流济? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腌闯,結(jié)果婚禮上袭灯,老公的妹妹穿的比我還像新娘。我一直安慰自己绑嘹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布橘茉。 她就那樣靜靜地躺著工腋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畅卓。 梳的紋絲不亂的頭發(fā)上擅腰,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音翁潘,去河邊找鬼趁冈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拜马,可吹牛的內(nèi)容都是我干的渗勘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俩莽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旺坠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扮超,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤取刃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后出刷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璧疗,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年馁龟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崩侠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屁柏,死狀恐怖啦膜,靈堂內(nèi)的尸體忽然破棺而出有送,到底是詐尸還是另有隱情,我是刑警寧澤僧家,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布雀摘,位于F島的核電站,受9級(jí)特大地震影響八拱,放射性物質(zhì)發(fā)生泄漏阵赠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一肌稻、第九天 我趴在偏房一處隱蔽的房頂上張望清蚀。 院中可真熱鬧,春花似錦爹谭、人聲如沸枷邪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)东揣。三九已至,卻和暖如春腹泌,著一層夾襖步出監(jiān)牢的瞬間嘶卧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人们颜。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓椅寺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容