3

我的表有以下数据,

ID name  devID
1  abc    101
2  def    111
3  ghi    121
4  abc    102
5  def    110

我想根据以下条件选择行(ID、名称、devID):

一个。名称 abc 的 devID 的值已增加 1,因此结果中应仅显示更高值的记录(仅 102)

湾。名称 def 的 devID 值已减 1,应显示所有记录(111 和 110)

此外,我们将继续为不同的行添加记录,并且每个名称在表中的行数不会超过 2 行或最多 3 行,因此上述条件应始终为真。

请帮我解决这个问题。提前致谢。

4

4 回答 4

2

使用INNER JOINwith 本身和UNION结果可能是一个好方法。

SQL小提琴

/* select all rows that match criteria A */
SELECT d2.ID, d2.name, d2.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID + 1 
                             AND d2.ID > d1.ID
UNION
/* select first rows that match criteria B */
SELECT d1.ID, d1.name, d1.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID - 1 
                             AND d2.ID > d1.ID
UNION
/* select second rows that match criteria B */
SELECT d2.ID, d2.name, d2.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID - 1 
                             AND d2.ID > d1.ID
于 2013-05-22T18:33:54.793 回答
2

我使用了增量方法。我真的没有看到其他选择。我相信这会返回您需要的东西:

create table #t1
(
    ID int identity,
    name varchar(3),
    devID int
)

insert into #t1(name,devID)
values('abc',101),('def',111),('ghi',121),('abc',102),('def',110)


create table #t2
(
    ID int,
    name varchar(3),
    devID int
)

declare @count int = 1,
    @name1 varchar(3)
while @count <= (select MAX(ID) from #t1)
begin--1
    set @name1 = (select name from #t1 where ID = @count)
    if (@name1 not in (select distinct name from #t2)) or ((select devID from #t1 where ID = @count) < (select devID from #t2 where name = @name1))
    begin--2
        insert into #t2
            select *
            from #t1
            where ID = @count
    end--2
    else
    begin--2
        update #t2
            set devID = (select devID from #t1 where ID = @count)
            where name = @name1
    end--2

    set @count+=1
end--1

select *
from #t2

drop table #t1
drop table #t2

编辑:结果:

ID          name devID
----------- ---- -----------
1           abc  102
2           def  111
3           ghi  121
5           def  110

(4 row(s) affected)
于 2013-05-22T18:22:06.970 回答
2

如果我理解正确,您只是想获得最新的devID(如下所示)。

那么,如果这种简单的方法也有效,为什么还要打扰 Joins 和东西

SELECT DISTINCT(Name), (SELECT TOP 1 devID FROM Table t2 
WHERE t2.Name=t1.Name Order By ID desc) FROM table t1

您的记录:

ID name  devID
1  abc    101
2  def    111
3  ghi    121
4  abc    102
5  def    110

您的预期结果(也与提琴手一起检查)

name  devID
ghi    121
abc    102
def    110
于 2013-05-22T21:05:29.613 回答
1

如果我正确理解了您的问题,以下内容应该可以帮助您解决问题:

SELECT *
FROM table_data AS a
WHERE a.devid >=
    (SELECT DEVID
     FROM table_data AS C
     WHERE c.ID =
         (SELECT max(b.ID)
          FROM table_data AS b
          GROUP BY b.name HAVING b.name = a.name)) ;

SQL小提琴: http ://www.sqlfiddle.com/#!3/b14513/18

此代码仅显示具有DEVID更大(或等于)最后插入DEVID的具有该名称的某人的Name行。

结果

ID  NAME    DEVID
2   def     111
3   ghi     121
4   abc     102
5   def     110

更新(查询可以进一步简化为):

SELECT *
FROM table_data AS a
WHERE a.devid >=
    (SELECT DEVID
     FROM table_data AS C
     WHERE c.ID =
         (SELECT max(b.ID)
          FROM table_data AS b
          where b.name = a.name)) ;

索引也应该放在 ID 和 devID 中。

于 2013-05-22T18:31:21.660 回答