Change Dir

          先知cd——熱愛生活是一切藝術的開始

          導航

          <2015年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告

          寫下來的都是資源,分享給互聯網~~均屬原創隨筆。
          轉載引用請注明作者changedi。
          喜歡應用研究,熱愛編程,歡迎交流。

          隨筆分類(125)

          隨筆檔案(123)

          統計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術

          我的鏈接

          淘寶技術

          閱讀排行榜

          評論排行榜

          Leetcode-Database-180-Consecutive Numbers-Medium

          題目地址:https://oj.leetcode.com/problems/consecutive-numbers/

           

          這個題目是要求寫一個sql,查詢出表中連續出現三次的記錄。表結構非常簡單如下:

          +----+-----+
          | Id | Num |
          +----+-----+
          | 1  |  1  |
          | 2  |  1  |
          | 3  |  1  |
          | 4  |  2  |
          | 5  |  1  |
          | 6  |  2  |
          | 7  |  2  |
          +----+-----+

           

           

          這個Logs表里,只有IdNum字段,而題目就是要找出連續出現3次的Num,對于這個表,答案就是1了。

          思路很直觀暴力的一個想法就是Logs表自己關聯3次,關聯條件依次是Id+1,這樣就可以把連續記錄關聯出來了

          我的代碼如下:

          select
          distinct o1.Num
          from(
          select * from Logs
          )o1
          join(
          select * from Logs
          )o2
          on(o1.Num=o2.Num and o1.Id=o2.Id+1)
          join(
          select * from Logs
          )o3
          on(o2.Num=o3.Num and o2.Id=o3.Id+1)

           

          這個題目雖然可以這樣解掉,但是很自然的會聯想,如果3變成n呢,題目變為求連續出現n次的記錄,那該如何解?顯然暴力解法是不可行的。鑒于能力有限,我從discuss區找到了一個很贊的解法,通過定義變量,很巧妙的解了這個擴展的問題,原作者kent-huang

          代碼如下:

          select DISTINCT num 
          FROM (
            select 
              num, 
              case when @record = num then @count:=@count+1 
                   when @record <> @record:=num then @count:=1 
              end as n 
            from Logs ,(
              select 
                 @count:=0,
                 @record:=(SELECT num from Logs limit 0,1)
            ) r 
          ) a 
          where a.n>=3

           

          簡單分析一下,作者通過定義兩個變量recordcount來控制記錄和對應的rank值,首先通過一個select @count:=0,@record:=(SELECT num from Logs limit 0,1)語句來初始化這兩個變量count=0record=表里第一條記錄的num。接下來通過普通查詢,將Logs表里每一條記錄查出來,和record對比,如果相同,則count自增1,如果不同,那么新的record被賦值,同時count1,很漂亮的自定義變量用sql實現了我們直覺上需要用邏輯代碼來完成的功能。而且這個代碼的一大優勢是不需要用到Id字段~~非常棒

           

          還有好的思路,請一定分享給我~~:)

          posted on 2015-01-29 19:01 changedi 閱讀(3988) 評論(1)  編輯  收藏 所屬分類: 數據

          評論

          # re: Leetcode-Database-180-Consecutive Numbers-Medium 2015-01-29 21:39 京山游俠

          mark。
          博主的頁面打開太慢了。  回復  更多評論   

          主站蜘蛛池模板: 衢州市| 商南县| 临夏县| 十堰市| 南川市| 英德市| 云霄县| 宝山区| 无极县| 桓台县| 庆阳市| 建瓯市| 东乡族自治县| 郁南县| 余庆县| 河津市| 来安县| 普宁市| 宁化县| 荆州市| 贵溪市| 分宜县| 怀宁县| 柳林县| 博客| 赤峰市| 潞西市| 筠连县| 微山县| 松桃| 合山市| 宁国市| 青龙| 酉阳| 岳阳市| 黄陵县| 石城县| 武城县| 都安| 漳浦县| 绍兴县|