1

我有一个表名“Numerator”有 3 列:No_Fact、Numerat 和 Date。像这样:

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 列中缺少的数字,总而言之,我只想显示我今天单独输入的一行,然后根据 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。在这种情况下,确切地知道这个缺少的数字是在什么日期并不重要,显然缺少一个数字,应该注意,并且在所有公共假期的 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 回答