1

テーブル名「Numerator」には、No_Fact、Numerat、Date の 3 つの列があります。このような:

No_Fact         Numerat         Date
1207020015      000713          2012-07-02 00:00:00.000
1207020016      000720          2012-07-02 00:00:00.000
1207020017      000722          2012-07-02 00:00:00.000
1207020019      000723          2012-07-02 00:00:00.000
1207020022      000724          2012-07-02 00:00:00.000
1207020021      000733          2012-07-02 00:00:00.000
1207020020      000734          2012-07-02 00:00:00.000
1207020018      000735          2012-07-02 00:00:00.000
1208120001      000766          2012-08-12 00:00:00.000
1208120002      000769          2012-08-12 00:00:00.000
1208230001      000777          2012-08-23 00:00:00.000
1208230002      000780          2012-08-23 00:00:00.000

Numerat 列内の数値の間に欠落している数値を表示したいので、次のコードを使用してみました。

SELECT A.Numerat+1 AS 'MISSING FROM', MIN(B.Numerat)-1 AS 'TO'
FROM Numerator A, Numerator B
WHERE A.Numerat < B.Numerat
GROUP BY A.Numerat
HAVING A.Numerat+1 < MIN(B.Numerat)
ORDER BY 1

そして結果セット:

MISSING FROM   TO
714            719 
721            721
725            732
736            765
767            768
770            776
778            779

素敵なコーデですね。しかし、シーケンス番号が多すぎて、簡潔にする必要性と両立しません。したがって、今日 (2012-08-23) のみのパーツ行を表示したい場合は、次のようにします。

MISSING FROM   TO
778            779

それを解読できる人にはとても感謝しています、ありがとう。

表の挿入の次の行が 2012 年 8 月 23 日に始まったときに興味深いことがあります。

No_Fact         Numerat         Date
1208230001      000777          2012-08-23 00:00:00.000
1208230002      000780          2012-08-23 00:00:00.000
1208250001      000782          2012-08-25 00:00:00.000
1208250002      000783          2012-08-25 00:00:00.000
1208250003      000784          2012-08-25 00:00:00.000
1208250004      000785          2012-08-25 00:00:00.000
1208250005      000786          2012-08-25 00:00:00.000
1208250006      000788          2012-08-25 00:00:00.000
1208250007      000789          2012-08-25 00:00:00.000
1208250008      000790          2012-08-25 00:00:00.000
1208250009      000793          2012-08-25 00:00:00.000
1208250010      000794          2012-08-25 00:00:00.000

当初の目的として、Numerat 列の欠落している数字を確認し、要約すると、この日 1 人で入力した行を表示したかっただけでした。その後、bluefeet からのアドバイスを受けて、次のコードを使用します。

SELECT A.Numerat+1 AS 'MISSING FROM', MIN(B.Numerat)-1 AS 'TO'
FROM Numerator A
INNER JOIN Numerator B
  ON A.Numerat < B.Numerat
  AND a.Tanggal = DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()), 0)
GROUP BY A.Numerat
HAVING A.Numerat+1 < MIN(B.Numerat)
ORDER BY 1

そして結果を達成する:

MISSING FROM   TO
787            787
791            792

注意深く見ると、表示されていない欠落している番号があります。つまり、次のとおりです。

MISSING FROM   TO
781            781

しかし、日付を含めて正確にはわかりませんか?23 または 25 です。この場合、この欠けている数字が正確に何日に当たるかを知ることは重要ではありません。明らかに、欠けている数字が 1 つあります。注意が必要です。すべての祝日の 24 日が期限です。入力しましょう。 25日に。誰でも助けることができますか?

4

1 に答える 1

1

このクエリを実行するいくつかの異なる方法を次に示します。すべてに日付が組み込まれています。

SELECT A.Numerat+1 AS 'MISSING FROM', MIN(B.Numerat)-1 AS 'TO'
FROM test A
INNER JOIN test B
  ON A.Numerat < B.Numerat
  AND a.dt = DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()), 0)
GROUP BY A.Numerat
HAVING A.Numerat+1 < MIN(B.Numerat)
ORDER BY 1

デモで SQL Fiddle を参照してください

または

;with cte as
(
  select numerat, dt, 
    row_number() over(partition by dt order by numerat) rn
  from test
  where dt = DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()), 0)
)
select c.Numerat+1 MissingFrom, t.Numerat-1 [To]
from cte c
inner join test t
  on c.Numerat < t.Numerat
where c.rn = 1

デモで SQL Fiddle を参照してください

またはMAX()、日付のない集計を使用できます。

SELECT max([Missing From]), max([to])
FROM
(
  SELECT A.Numerat+1 AS 'MISSING FROM', MIN(B.Numerat)-1 AS 'TO'
  FROM test A
  INNER JOIN test B
    ON A.Numerat < B.Numerat
  GROUP BY A.Numerat
  HAVING A.Numerat+1 < MIN(B.Numerat)
) x

デモで SQL Fiddle を参照してください

于 2012-08-23T09:34:39.257 に答える