大大毛 的筆記

            DDM's Note

          哪怕沒有辦法一定有說法,
          就算沒有鴿子一定有烏鴉,
          固執(zhí)無罪 夢想有價,
          讓他們驚訝.

          posts - 14, comments - 23, trackbacks - 0, articles - 58
             :: 首頁 ::  :: 聯(lián)系 ::  :: 管理

          查找不連續(xù)數(shù)據的多種方法

          Posted on 2007-09-03 19:31 大大毛 閱讀(459) 評論(0)  編輯  收藏 所屬分類: SQL

          問題:

          ??????經常會遇到在業(yè)務邏輯上數(shù)據連續(xù)的而需要找到那些不連續(xù)數(shù)據的情況。
          ??????解決此類問題的方法有很多,可以根據具體的數(shù)據結構來加以選擇運用,現(xiàn)就示例說明:

          示例1:
          表A結構

          ???表結構說明
          ??????kID??????主關鍵字,例如合同號
          ??????iNo??????序號(>=1),從業(yè)務邏輯上來說對於同一筆合同號該列的值應該保持連續(xù)遞增
          ???要求
          ??????找到那些有問題的 kID

          解決方法:
          ??????表A屬於是一種比較單純、簡單的結構,對於這類只要直接在表上做一次處理即可。
          ??????1. 方法A --?自連接
          ?????????利用對自身表的 iNo?進行錯值(+1或-1)外連,?找到無法連接的數(shù)據。
          自連接

          ??????這樣就可以定位到那些有問題的 kID 上。
          ??????這種解決方法是最通用的方法,不過在編寫上比較複雜。

          ??????2. 方法B -- 利用Count(*)
          利用Count(*)

          ??????看看這個實現(xiàn)就可以發(fā)現(xiàn),這裏比較巧妙的利用了 iNo 列上的邏輯規(guī)則 (int型的連續(xù)遞增),如果 iNo 不從1開始計數(shù)則在Having 子句中加一點點運算即可。
          ??????這個解決方法比較巧妙,執(zhí)行效率較高。

          ??????3. 方法C --?利用函數(shù)
          利用公式運算

          ??????方法C 與方法B 的思路實際上是一致的,就是利用 Group?,在 iNo?列上直接實施檢查,方法C 功能更加強大一些,因為如果 iNo 的規(guī)則有變更的話(如奇數(shù)遞增, :P ),改改這裏用的 n(n+1)?/ 2 的公式就好。


          示例2:
          ??????這裏是另外一種情況,相比示例1 來說更加複雜一些,它的 iNo 列由多列組成,示例如下。
          表B結構

          ??????表結構說明
          ?????????kID????????????主關鍵字,例如合同號
          ?????????iYear?????????第幾年度( >= 1),連續(xù)遞增
          ?????????iMonth?????第幾月份[1, 12],連續(xù)遞增
          ??????要求
          ?????????找到那些年度+月份不連續(xù)的 kID

          解決方法:
          ??????表B 的結構與表A 相比在需要檢查的列上變成多列的結構,而且多列的內部還有著一些隱含關係(如這裏示例中的年/月,顯然不可能第1年度未滿12月就跳到第2年度),不過就實質來看與表A 的結構一致 ( 可以將iYear , iMonth 看成一列?),因此同樣可以適用示例1中的方法,只要多加合併?iYear,?iMonth的邏輯就好。
          ??????這裏對iYear, iMonth列的合併,使用自定義列 + 表封裝 的方式來實現(xiàn),下面就示例上面的Count方式。?
          利用Count(*)

          i am ddm

          主站蜘蛛池模板: 许昌县| 无为县| 灵寿县| 星座| 孙吴县| 石河子市| 海晏县| 凭祥市| 揭东县| 留坝县| 贡山| 曲麻莱县| 长寿区| 股票| 伊金霍洛旗| 西平县| 商南县| 白银市| 吉木萨尔县| 中宁县| 天柱县| 合川市| 鄢陵县| 武强县| 康定县| 池州市| 红桥区| 八宿县| 新蔡县| 航空| 武冈市| 宜都市| 墨江| 普安县| 林西县| 弋阳县| 呈贡县| 泽普县| 花莲市| 清河县| 建平县|