SQL按查询分组以从同一表中选择数据

SQL按查询分组以从同一表中选择数据,sql,sql-server,Sql,Sql Server,我的表格有以下数据 ID name devID 1 abc 101 2 def 111 3 ghi 121 4 abc 102 5 def 110 我想根据以下条件选择行(ID、name、devID): a。名称abc的devID值增加了1,因此结果中只应显示更高值的记录(仅102) b。名称def的devID值已减少1,它应显示所有记录 (111和110) 此外,我们将继续为不同的行添加记录,每个名称在表中的行数不超过2行或最多3行,因此上述条件应始

我的表格有以下数据

ID name  devID
1  abc    101
2  def    111
3  ghi    121
4  abc    102
5  def    110
我想根据以下条件选择行(ID、name、devID):

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

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

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

请帮我回答这个问题。
提前感谢。

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

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

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

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 Fiddle:

此代码导致仅显示名为
name
的人员的
DEVID大于(或等于)上次插入的
DEVID
的行

结果

ID  NAME    DEVID
2   def     111
3   ghi     121
4   abc     102
5   def     110
更新(查询可进一步简化为):


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

使用
内部连接本身和
联合,结果可能是一个很好的方法


如果我理解正确,您只需要获取最新的设备(如下所示)

那么如果这种简单的方法也能奏效,为什么还要费心处理连接和其他东西呢

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
您的预期结果(也与fiddler一起检查)


我正在使用sql server 2008 RDBMS基于您的数据最终结果中是否会出现ghi
?因此,您的算法是,基于上一个设备ID(如果它大于或小于上一个设备ID),您希望影响返回的内容。你能更好地解释一下你为什么要这么做吗?你的解决方案是可行的,但是你过滤掉了名称“GHI”的条目,这会导致一行丢失。请参阅:+1以获得快速结果。您的查询比使用嵌套查询快得多。@meewoK-我知道,但不清楚它是否应该出现在结果中(请参阅BlueFoot的评论)。
/* 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
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