2

すべての店舗からのすべての注文を保持するテーブル注文があります。各店舗のシーケンス順序を確認するクエリを作成しました。そのように見えます。

select WebStoreID, min(webordernumber), max(webordernumber), count(webordernumber) 
from orders
where ordertype = 'WEB' 
group by WebStoreID

このクエリですべての注文が存在することを確認できます。Web注文番号は1...nからの番号です。

一時/別のテーブルに参加せずに不足している注文を見つけるクエリを作成するにはどうすればよいですか?

4

4 に答える 4

6

前の行がない行を検出するために、テーブル自体を結合できます。

select cur.*
from orders cur
left join orders prev 
    on cur.webordernumber = prev.webordernumber + 1
    and cur.webstoreid = prev.webstoreid
where cur.webordernumber <> 1
and prev.webordernumer is null

これにより、1...n シーケンスのギャップが検出されますが、重複は検出されません。

于 2009-04-29T15:22:55.513 に答える
4

「1 から n までのすべての整数」の補助テーブルを作成します ( SQL Server 関数で作成する方法については、 http://www.sql-server-helper.com/functions/integer-table.aspxを参照してください。しかし、それは何度も必要になるものなので、とにかく実際のテーブルにします.SQLエンジンを使用すると、一度だけ作成するのは簡単です)次に、ネストされたクエリSELECT value FROM integers WHERE value NOT IN (SELECT webordernumber FROM orders)&cを使用します. また、http: //www.sqlmag.com/Article/ArticleID/99797/sql_server_99797.html に似た問題、「一連の数字のギャップを検出する」も参照してください。

于 2009-04-29T15:17:30.830 に答える
2

rank() 関数はあるが、lag() 関数がない場合 (つまり、SQL Server)、これを使用できます ( http://www.sqlmonster.com/Uwe/Forum.aspx/sql-serverで推奨) -programming/10594/Return-gaps-in-a-sequence ):

create table test_gaps_in_sequence (x int)
insert into test_gaps_in_sequence values ( 1 )
insert into test_gaps_in_sequence values ( 2 )
insert into test_gaps_in_sequence values ( 4 )
insert into test_gaps_in_sequence values ( 5 )
insert into test_gaps_in_sequence values ( 8 )
insert into test_gaps_in_sequence values ( 9 )
insert into test_gaps_in_sequence values ( 12)
insert into test_gaps_in_sequence values ( 13)
insert into test_gaps_in_sequence values ( 14)
insert into test_gaps_in_sequence values ( 29)

...

 select lower_bound
         , upper_bound
      from (select upper_bound
                 , rank () over (order by upper_bound) - 1 as upper_rank
              from (SELECT x+n as upper_bound
                      from test_gaps_in_sequence
                         , (SELECT 0 n
                            UNION
                            SELECT -1
                           ) T
                     GROUP BY x+n
                    HAVING MAX(n) = -1
                    ) upper_1
            ) upper_2
         , (select lower_bound
                 , rank () over (order by lower_bound) as lower_rank
              from (SELECT x+n as lower_bound
                      from test_gaps_in_sequence
                         , (SELECT 0 n
                            UNION
                            SELECT 1
                           ) T
                     GROUP BY x+n
                    HAVING MIN(n) = 1
                    ) lower_1
            ) lower_2
      where upper_2.upper_rank = lower_2.lower_rank
      order by lower_bound

... または、「外側の制限」を含めるには:

select lower_bound
     , upper_bound
  from (select upper_bound
             , rank () over (order by upper_bound) - 1 as upper_rank
          from (SELECT x+n as upper_bound
                  from test_gaps_in_sequence
                     , (SELECT 0 n
                        UNION
                        SELECT -1
                       ) T
                 GROUP BY x+n
                HAVING MAX(n) = -1
                ) upper_1
        ) upper_2
   full join (select lower_bound
             , rank () over (order by lower_bound) as lower_rank
          from (SELECT x+n as lower_bound
                  from test_gaps_in_sequence
                     , (SELECT 0 n
                        UNION
                        SELECT 1
                       ) T
                 GROUP BY x+n
                HAVING MIN(n) = 1
                ) lower_1
        ) lower_2
   on upper_2.upper_rank  = lower_2.lower_rank
     order by coalesce (lower_bound, upper_bound)
于 2011-02-19T13:00:09.247 に答える
1

データベースが分析関数をサポートしている場合は、次のようなクエリを使用できます。

select prev+1, curr-1 from
( select webordernumber curr,
         coalesce (lag(webordernumber) over (order by webordernumber), 0) prev
  from   orders
)
where prev != curr-1;

出力にはギャップが表示されます。

prev+1 curr-1
------ ------
     3      7

3 から 7 までの数字が欠落していることを意味します。

于 2009-04-29T15:17:48.987 に答える