0

書き込もうとしている SQL クエリがありますが、解決策を思いつくことができませんでした。

関連するテーブル内の 2 つのエントリは、ID の最初の 3 文字によって関連付けられます。特定のエントリに関連付ける必要がある新しい項目が追加されると、最初の 3 文字が追加され、2 番目の 2 文字が 1 ずつ増えて新しい ID が作成されます。完全に別のエントリが必要な場合は、一意の 3 桁の文字列が使用され、次の 2 文字が「00」で始まります。削除されたデータが原因で、最後の 2 列に大きなギャップがあるものがあるかもしれません (これらをクエリに含めたくありません)。

私がしたいのは、最初の 3 文字が同じで、最後の 2 文字から 1 文字少ない別の行がある行のみを取得することです。

テーブルの例:

ID    |  Date 
====== ========
11100 | 07/12
22211 | 07/13
12300 | 07/14
11101 | 07/14
11400 | 07/16
22212 | 07/16

最初の 3 文字が同じで、最後の 2 文字が 1 文字少ない別のエントリが存在するため、クエリはこれらの要素のみを返す必要があります。

ID    |  Date 
====== ========
11101 | 07/14
22212 | 07/16
4

3 に答える 3

5

単純な JOIN でできるようです。

SELECT a.*
FROM Table1 a
JOIN Table1 b
  ON a.id/100 = b.id/100
 AND a.id = b.id + 1

でテストする SQLfiddle

EXISTSクエリとして記述することもできます。

SELECT a.* 
FROM Table1 a
WHERE EXISTS (
  SELECT 1 FROM Table1 b WHERE b.id = a.id-1
     AND a.id/100 = b.id/100
)

別の SQLfiddle

于 2013-07-29T15:30:01.550 に答える
0
Declare @a table(ID Varchar(10),  [Date] varchar(10))
Insert into @a
Select '11100','07/12'
UNION  Select '22211','07/13'
UNION  Select '12300','07/14'
UNION  Select '11101','07/14'
UNION  Select '11400','07/16'
UNION  Select '22212','07/16'

Select a.* from
@a a
JOIN
(
Select SubString(ID,1,3) + RIGHT('0'+Cast(MAX(Cast(SubString(ID,4,2) as int)) as Varchar(10)),2) as ID
from @a
group by SubString(ID,1,3)
Having Count(*)>1
) x
on x.ID=a.ID
于 2013-07-29T15:32:15.613 に答える