亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQL面試題:求時間差之和(有重復不計)

 更新時間:2019年11月20日 09:11:32   作者:開心學大數據  
這篇文章主要介紹了SQL面試題:求時間差之和(有重復不計),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

面試某某公司BI崗位的時候,面試題中的一道sql題,咋看一下很簡單,寫的時候發(fā)現自己缺乏總結,沒有很快的寫出來。

題目如下:

求每個品牌的促銷天數

表sale為促銷營銷表,數據中存在日期重復的情況,例如id為1的end_date為20180905,id為2的start_date為20180903,即id為1和id為2的存在重復的銷售日期,求出每個品牌的促銷天數(重復不算)

表結果如下:

+------+-------+------------+------------+
| id | brand | start_date | end_date |
+------+-------+------------+------------+
| 1 | nike | 2018-09-01 | 2018-09-05 |
| 2 | nike | 2018-09-03 | 2018-09-06 |
| 3 | nike | 2018-09-09 | 2018-09-15 |
| 4 | oppo | 2018-08-04 | 2018-08-05 |
| 5 | oppo | 2018-08-04 | 2018-08-15 |
| 6 | vivo | 2018-08-15 | 2018-08-21 |
| 7 | vivo | 2018-09-02 | 2018-09-12 |
+------+-------+------------+------------+

最終結果應為

brand all_days
nike 13
oppo 12
vivo 18

建表語句

-- ----------------------------
-- Table structure for sale
-- ----------------------------
DROP TABLE IF EXISTS `sale`;
CREATE TABLE `sale` (
 `id` int(11) DEFAULT NULL,
 `brand` varchar(255) DEFAULT NULL,
 `start_date` date DEFAULT NULL,
 `end_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sale
-- ----------------------------
INSERT INTO `sale` VALUES (1, 'nike', '2018-09-01', '2018-09-05');
INSERT INTO `sale` VALUES (2, 'nike', '2018-09-03', '2018-09-06');
INSERT INTO `sale` VALUES (3, 'nike', '2018-09-09', '2018-09-15');
INSERT INTO `sale` VALUES (4, 'oppo', '2018-08-04', '2018-08-05');
INSERT INTO `sale` VALUES (5, 'oppo', '2018-08-04', '2018-08-15');
INSERT INTO `sale` VALUES (6, 'vivo', '2018-08-15', '2018-08-21');
INSERT INTO `sale` VALUES (7, 'vivo', '2018-09-02', '2018-09-12');

方式1:

利用自關聯下一條記錄的方法

select brand,sum(end_date-befor_date+1) all_days from 
 (
 select s.id ,
  s.brand ,
  s.start_date ,
  s.end_date , 
  if(s.start_date>=ifnull(t.end_date,s.start_date) ,s.start_date,DATE_ADD(t.end_date,interval 1 day) ) as befor_date
 from sale s left join (select id+1 as id ,brand,end_date from sale) t on s.id = t.id and s.brand = t.brand
 order by s.id
 )tmp
 group by brand

運行結果

+-------+---------+
| brand | all_day |
+-------+---------+
| nike |  13 |
| oppo |  12 |
| vivo |  18 |
+-------+---------+

該方法對本題中的表格有效,但對于有id不連續(xù)的品牌的記錄時不一定適用。

方式2:

SELECT a.brand,SUM(
 CASE 
  WHEN a.start_date=b.start_date AND a.end_date=b.end_date
  AND NOT EXISTS(
  SELECT *
  FROM sale c LEFT JOIN sale d ON c.brand=d.brand 
   WHERE d.brand=a.brand
   AND c.start_date=a.start_date
   AND c.id<>d.id 
   AND (d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date>c.end_date
   OR 
  c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date>d.end_date)
    ) 
   THEN (a.end_date-a.start_date+1) 
  WHEN (a.id<>b.id AND b.start_date BETWEEN a.start_date AND a.end_date AND b.end_date>a.end_date ) THEN (b.end_date-a.start_date+1)
  ELSE 0 END
  ) AS all_days 
FROM sale a JOIN sale b ON a.brand=b.brand GROUP BY a.brand

運行結果

+-------+----------+
| brand | all_days |
+-------+----------+
| nike |  13 |
| oppo |  12 |
| vivo |  18 |
+-------+----------+

其中條件

d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date>c.end_date
   OR 
c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date>d.end_date

可以換成

c.start_date < d.end_date AND (c.end_date > d.start_date)

結果同樣正確

用分析函數同樣可行的,自己電腦暫時沒裝oracle,用的mysql寫的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MySQL基本操作語句小結

    MySQL基本操作語句小結

    這篇文章主要介紹了MySQL的基本操作語句,是MySQL入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • MySQL數據庫10秒內插入百萬條數據的實現

    MySQL數據庫10秒內插入百萬條數據的實現

    假設現在我們要向mysql插入500萬條數據,如何實現高效快速的插入進去?本文就詳細的介紹一下,感興趣的可以了解一下
    2021-10-10
  • MySQL中count()和count(1)有何區(qū)別以及哪個性能最好詳解

    MySQL中count()和count(1)有何區(qū)別以及哪個性能最好詳解

    count是一個函數,用來統(tǒng)計數據,但是count函數傳入的參數有很多種,比如count(1)、count(*)、count(字段)等,下面這篇文章主要給大家介紹了關于MySQL中count()和count(1)有何區(qū)別以及哪個性能最好的相關資料,需要的朋友可以參考下
    2022-08-08
  • mysql 5.7更改數據庫的數據存儲位置的解決方法

    mysql 5.7更改數據庫的數據存儲位置的解決方法

    隨著MySQL數據庫存儲的數據逐漸變大,已經將原來的存儲數據的空間占滿了,導致mysql已經鏈接不上了。所以要給存放的數據換個地方,下面小編給大家分享mysql 5.7更改數據庫的數據存儲位置的解決方法,一起看看吧
    2017-04-04
  • Mysql連接數設置和獲取的方法

    Mysql連接數設置和獲取的方法

    這篇文章主要介紹了Mysql連接數設置和獲取的方法,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2021-01-01
  • MySQL如何添加數據insert命令

    MySQL如何添加數據insert命令

    這篇文章主要介紹了MySQL如何添加數據insert命令問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • win10安裝zip版MySQL8.0.19的教程詳解

    win10安裝zip版MySQL8.0.19的教程詳解

    這篇文章主要介紹了win10安裝zip版MySQL8.0.19的教程詳細,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • mysql 5.7.13 安裝配置方法圖文教程(linux)

    mysql 5.7.13 安裝配置方法圖文教程(linux)

    這篇文章主要為大家詳細介紹了linux下mysql 5.7.13 安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • mysql8.0.20配合binlog2sql的配置和簡單備份恢復的步驟詳解

    mysql8.0.20配合binlog2sql的配置和簡單備份恢復的步驟詳解

    這篇文章主要介紹了mysql8.0.20配合binlog2sql的配置和簡單備份恢復的步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Linux/UNIX和Window平臺上安裝Mysql

    Linux/UNIX和Window平臺上安裝Mysql

    這篇文章主要為大家詳細介紹了Linux/UNIX和Window兩個系統(tǒng)上采用命令安裝Mysql的方法,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論