0

我有一个我正在尝试编写的 SQL 查询,但无法提出解决方案。

我表中的 2 个相关条目通过 ID 的前 3 个字符相关。当添加一个需要与某个条目相关的新项目时,添加前 3 个字符,然后将第 2 个字符加 1 以创建新 ID。当需要一个完全独立的条目时,使用一个唯一的 3 位字符串,并以“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

Query 应该只返回这些元素,因为存在另一个条目,前 3 个字符相同,后 2 个字符少一个。

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 回答
0

试试这个

SELECT T1.ID,T1.[Date] FROM Table1 T1 INNER JOIN  
(
  SELECT LEFT(ID,3) AS ID,MAX([Date]) AS [Date] FROM Table1
  GROUP BY LEFT(ID,3)
  HAVING COUNT(LEFT(ID,3)) > 1
) T2 ON LEFT(T1.ID,3) = T2.ID
AND T1.[Date] = T2.[Date]

SQL 小提琴演示

于 2013-07-29T15:35:53.727 回答