leetCode数据查询笔记(困难)
601. 體育館的人流量
X 市建了一個新的體育館,每日人流量信息被記錄在這三列信息中:序號 (id)、日期 (date)、 人流量 (people)。
請編寫一個查詢語句,找出高峰期時段,要求連續三天及以上,并且每天人流量均不少于100。
例如,表 stadium:
+------+------------+-----------+ | id | 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-08 | 188 | +------+------------+-----------+對于上面的示例數據,輸出為:
+------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+Note:
每天只有一行記錄,日期隨著 id 的增加而增加。
思路/筆記:自連接的應用,這個語句其實有點取巧,因為日期都是連續的,而Id屬于INT類型,比TO_DATE(date, 'yyyymmdd')/TO_CHAR(DATE, 'yyyymmdd')這樣的運算快多了。
select distinct t1.*from stadium t1, stadium t2, stadium t3where t1.people >= 100 and t2.people >= 100 and t3.people >= 100and ((t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1)or (t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1)or (t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2))order by t1.id262. 行程和用戶
Trips 表中存所有出租車的行程信息。每段行程有唯一健 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外鍵。Status 是枚舉類型,枚舉成員為 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
+----+-----------+-----------+---------+--------------------+----------+ | Id | Client_Id | Driver_Id | City_Id | Status |Request_at| +----+-----------+-----------+---------+--------------------+----------+ | 1 | 1 | 10 | 1 | completed |2013-10-01| | 2 | 2 | 11 | 1 | cancelled_by_driver|2013-10-01| | 3 | 3 | 12 | 6 | completed |2013-10-01| | 4 | 4 | 13 | 6 | cancelled_by_client|2013-10-01| | 5 | 1 | 10 | 1 | completed |2013-10-02| | 6 | 2 | 11 | 6 | completed |2013-10-02| | 7 | 3 | 12 | 6 | completed |2013-10-02| | 8 | 2 | 12 | 12 | completed |2013-10-03| | 9 | 3 | 10 | 12 | completed |2013-10-03| | 10 | 4 | 13 | 12 | cancelled_by_driver|2013-10-03| +----+-----------+-----------+---------+--------------------+----------+Users 表存所有用戶。每個用戶有唯一鍵 Users_Id。Banned 表示這個用戶是否被禁止,Role 則是一個表示(‘client’, ‘driver’, ‘partner’)的枚舉類型。
+----------+--------+--------+ | Users_Id | Banned | Role | +----------+--------+--------+ | 1 | No | client | | 2 | Yes | client | | 3 | No | client | | 4 | No | client | | 10 | No | driver | | 11 | No | driver | | 12 | No | driver | | 13 | No | driver | +----------+--------+--------+寫一段 SQL 語句查出 2013年10月1日 至 2013年10月3日 期間非禁止用戶的取消率。基于上表,你的 SQL 語句應返回如下結果,取消率(Cancellation Rate)保留兩位小數。
+------------+-------------------+ | Day | Cancellation Rate | +------------+-------------------+ | 2013-10-01 | 0.33 | | 2013-10-02 | 0.00 | | 2013-10-03 | 0.50 | +------------+-------------------+思路/筆記:常用操作,手動滑稽
select t.Request_at AS "Day",round(sum(case when t.Status = 'completed' then 0else 1end) / count(0),2) AS "Cancellation Rate"from trips t where EXISTS (select u.Users_Idfrom users uwhere u.Users_Id = t.Client_Idand u.Banned = 'No')and t.Request_at between '2013-10-01' and '2013-10-03' group by Day185. 部門工資前三高的員工
Employee 表包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id 。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | +----+-------+--------+--------------+Department 表包含公司所有部門的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+編寫一個 SQL 查詢,找出每個部門工資前三高的員工。例如,根據上述給定的表格,查詢結果應返回:
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Randy | 85000 | | IT | Joe | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+思路/筆記:
總結
數據庫操作的效率差別,需要在百萬/千萬/億/十億級別,才會有明顯的差異,比如BAT的數據級別,只能自行研發數據庫。所以這里只涉及到了很多基礎的操作,比如case的用法,自連接的用法等。具體在項目常用到的操作有根據范式來設計表、根據常用到的字段來建立索引、考慮根據數據量按日/周/月分區、如何通過存儲過程/函數高效轉移數據、如何設置UNDO表空間保證數據庫性能、怎樣查看常用視圖與統計表、如何備份、還原與清理數據...都還是需要在實際項目里去學習。
總結
以上是生活随笔為你收集整理的leetCode数据查询笔记(困难)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在centos7中安装redis,并通过
- 下一篇: 金蝶K/3 同步用核算项目配置