Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当同一记录在表中多次出现时,如何返回从不等于1的记录_Sql_Sql Server - Fatal编程技术网

Sql 当同一记录在表中多次出现时,如何返回从不等于1的记录

Sql 当同一记录在表中多次出现时,如何返回从不等于1的记录,sql,sql-server,Sql,Sql Server,我在上面给出了我的查询,但我试图做的是,返回所有不同的ID及其状态,其中在表中ID的所有实例中,is_FINAL和max Seq number都不等于1 因此,根据我想返回的示例: ID | Is_Final | SEQ | State ------------------------------------------- A1 0 12 Pending A1 0 13 Qu

我在上面给出了我的查询,但我试图做的是,返回所有不同的ID及其状态,其中在表中ID的所有实例中,is_FINAL和max Seq number都不等于1

因此,根据我想返回的示例:

ID  |  Is_Final   |    SEQ    |  State
-------------------------------------------
A1       0             12        Pending
A1       0             13        Quoted
B1       0             14        Pending 
B1       1             15        Quoted
C1       0             11        Pending 
C1       0             12        Pending
C1       0             13        Quoted


SELECT DISTINCT ID
FROM Table
WHERE ID NOT IN (SELECT ID FROM Table WHERE IS_FINAL = 1)

您可以将
不存在
行编号()一起使用


您可以将
不存在
行编号()一起使用


好的,所以我提出了一个非常简单的解决方案,它对你来说很有效,而且应该很容易理解。答案和演示是最上面的解释

select top (1) with ties t.*
from table t
where not exists (select 1 from table t1 where t1.id = t.id and t1.IS_FINAL = 1)
order by row_number() over (partition by id order by seq desc);
因此,在这个查询的内部部分,我们将获取
max
序列号,因为您需要最新的值

create table #SOQ (
    ID char(2),
    Is_Final smallint,
    SEQ int,
    State varchar(30))

insert into #SOQ values ('A1', 0 , 12, 'Pending') 
insert into #SOQ values ('A1', 0 , 13, 'Quoted') 
insert into #SOQ values ('B1', 0 , 14, 'Pending') 
insert into #SOQ values ('B1', 1 , 15, 'Quoted') 
insert into #SOQ values ('C1', 0 , 11, 'Pending') 
insert into #SOQ values ('C1', 0 , 12, 'Pending') 
insert into #SOQ values ('C1', 0 , 13, 'Quoted') 

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ
    where ID not in (
        select
            ID
        from #SOQ
        where Is_Final =1)
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
然后我们需要消除所有具有is final的值。我们可以通过某种形式的反连接来实现这一点。为了简单起见,我选择了
不在
中,但是
不存在
也可以工作,甚至可以表现得更好

select 
    ID,
    Max(SEQ) as MaxSEQ
from #SOQ 
然后在顶部,我们获取您的不同ID和状态值,并连接到该子查询以给出最终结果

select 
    ID,
    Max(SEQ) as MaxSEQ
from #SOQ
where ID not in (
    select
        ID
    from #SOQ
    where Is_Final =1)
这导致了

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ
    where ID not in (
        select
            ID
        from #SOQ
        where Is_Final =1)
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
我希望这种解释能帮助你找到你需要去的地方

编辑:我添加了一个使用
notexists
来完成此任务的示例

ID  State
A1  Quoted
C1  Quoted

好的,所以我提出了一个非常简单的解决方案,它对你来说很有效,而且应该很容易理解。答案和演示是最上面的解释

select top (1) with ties t.*
from table t
where not exists (select 1 from table t1 where t1.id = t.id and t1.IS_FINAL = 1)
order by row_number() over (partition by id order by seq desc);
因此,在这个查询的内部部分,我们将获取
max
序列号,因为您需要最新的值

create table #SOQ (
    ID char(2),
    Is_Final smallint,
    SEQ int,
    State varchar(30))

insert into #SOQ values ('A1', 0 , 12, 'Pending') 
insert into #SOQ values ('A1', 0 , 13, 'Quoted') 
insert into #SOQ values ('B1', 0 , 14, 'Pending') 
insert into #SOQ values ('B1', 1 , 15, 'Quoted') 
insert into #SOQ values ('C1', 0 , 11, 'Pending') 
insert into #SOQ values ('C1', 0 , 12, 'Pending') 
insert into #SOQ values ('C1', 0 , 13, 'Quoted') 

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ
    where ID not in (
        select
            ID
        from #SOQ
        where Is_Final =1)
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
然后我们需要消除所有具有is final的值。我们可以通过某种形式的反连接来实现这一点。为了简单起见,我选择了
不在
中,但是
不存在
也可以工作,甚至可以表现得更好

select 
    ID,
    Max(SEQ) as MaxSEQ
from #SOQ 
然后在顶部,我们获取您的不同ID和状态值,并连接到该子查询以给出最终结果

select 
    ID,
    Max(SEQ) as MaxSEQ
from #SOQ
where ID not in (
    select
        ID
    from #SOQ
    where Is_Final =1)
这导致了

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ
    where ID not in (
        select
            ID
        from #SOQ
        where Is_Final =1)
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
我希望这种解释能帮助你找到你需要去的地方

编辑:我添加了一个使用
notexists
来完成此任务的示例

ID  State
A1  Quoted
C1  Quoted
以下查询将起作用:

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ as NE
    where not exists (
        select
            1
        from #SOQ 
        where Is_Final =1
            and NE.ID = ID )
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
我使用了
densite\u RANK()
FIRST\u VALUE
函数来实现这一点

最初,由于没有列出唯一的PK值,因此为每个
ID
SEQ
组合生成该值。然后按降序获得每个组合的
FIRST\u值
(这很重要),这将帮助我们首先获得最新的行,然后过滤第一行

以下查询将起作用:

select distinct
    A.ID,
    State
from #SOQ as A
inner join (
    select 
        ID,
        Max(SEQ) as MaxSEQ
    from #SOQ as NE
    where not exists (
        select
            1
        from #SOQ 
        where Is_Final =1
            and NE.ID = ID )
    group by ID) as B
    on A.ID = B.ID
    and A.SEQ = B.MaxSEQ
我使用了
densite\u RANK()
FIRST\u VALUE
函数来实现这一点


最初,由于没有列出唯一的PK值,因此为每个
ID
SEQ
组合生成该值。然后按降序获得每个组合的
FIRST\u值
(这很重要),这将帮助我们首先获得最新的行,然后过滤第一行

您可以尝试下面的查询

SELECT ID,FstValue FROM
(
SELECT 
    ID,
    DENSE_RANK() OVER (PARTITION BY ID ORDER BY ID,SEQ DESC) RankOrder
    ,FIRST_VALUE(State) OVER (PARTITION BY ID ORDER BY ID) FstValue
FROM
    Table
WHERE 
    ID NOT IN (select DISTINCT ID from Table where Is_Final = 1)
    )m
WHERE RankOrder = 1
结果如下

create table #temp (ID varchar(5), Is_Final int, SEQ int, States Varchar(20))

insert into #temp values ('A1', 0, 12, 'Pending'),
('A1', 0, 13, 'Quoted'),
('B1', 0, 14, 'Pending'), 
('B1', 1, 15, 'Quoted'), 
('C1', 0, 11, 'Pending'),
('C1', 0, 12, 'Pending'),
('C1', 0, 13, 'Quoted')

select * into #NewTable from
(
select ID, MAX(seq) as MaxSeq FROM #temp group by id
)a
-- delete from #NewTable where ID in (select distinct ID FROM #temp where Is_Final = 1)

select #temp.ID, States from #NewTable
inner join #temp on #NewTable.ID = #temp.ID and #temp.SEQ = 
#NewTable.MaxSeq
where #temp.ID not in (select distinct ID FROM #temp where Is_Final = 1)

drop table #NewTable
drop table #temp
在新表中,已选择并插入所有id和max序列。在此之后,所有id(最终为1)已被删除。 最后,基于Id和Max序列使用了for-result连接


希望这将对您有所帮助。

您可以尝试以下查询

SELECT ID,FstValue FROM
(
SELECT 
    ID,
    DENSE_RANK() OVER (PARTITION BY ID ORDER BY ID,SEQ DESC) RankOrder
    ,FIRST_VALUE(State) OVER (PARTITION BY ID ORDER BY ID) FstValue
FROM
    Table
WHERE 
    ID NOT IN (select DISTINCT ID from Table where Is_Final = 1)
    )m
WHERE RankOrder = 1
结果如下

create table #temp (ID varchar(5), Is_Final int, SEQ int, States Varchar(20))

insert into #temp values ('A1', 0, 12, 'Pending'),
('A1', 0, 13, 'Quoted'),
('B1', 0, 14, 'Pending'), 
('B1', 1, 15, 'Quoted'), 
('C1', 0, 11, 'Pending'),
('C1', 0, 12, 'Pending'),
('C1', 0, 13, 'Quoted')

select * into #NewTable from
(
select ID, MAX(seq) as MaxSeq FROM #temp group by id
)a
-- delete from #NewTable where ID in (select distinct ID FROM #temp where Is_Final = 1)

select #temp.ID, States from #NewTable
inner join #temp on #NewTable.ID = #temp.ID and #temp.SEQ = 
#NewTable.MaxSeq
where #temp.ID not in (select distinct ID FROM #temp where Is_Final = 1)

drop table #NewTable
drop table #temp
在新表中,已选择并插入所有id和max序列。在此之后,所有id(最终为1)已被删除。 最后,基于Id和Max序列使用了for-result连接


希望这能对您有所帮助。

为什么不直接选择“从表中选择不同的ID,状态,其中为最终值!”1'? 我不认为你有任何真正的理由再次访问该表。既然你已经知道如何获取没有1的ID,那么公平地说,你唯一的问题是如何获取每个ID的最后一行吗?标记的dupe是不正确的。但简单的解决方案不是这里的解决方案。重新阅读问题并注意B1在返回的记录集中不是必需的。@TabAlleman:OP开始的方式确实只需要应用任何已知的最大n个分组技术。但也可以通过同时执行行组排除部分和最大n个组的部分来解决这个问题。(可能也有相应的重复目标,我不确定。)无论如何,到目前为止,我已经重新提出了这个问题,以邀请更广泛的解决方案。为什么不直接“选择distinct ID,State from table where IS_Final!=1'? 我不认为你有任何真正的理由再次访问该表。既然你已经知道如何获取没有1的ID,那么公平地说,你唯一的问题是如何获取每个ID的最后一行吗?标记的dupe是不正确的。但简单的解决方案不是这里的解决方案。重新阅读问题并注意B1在返回的记录集中不是必需的。@TabAlleman:OP开始的方式确实只需要应用任何已知的最大n个分组技术。但也可以通过同时执行行组排除部分和最大n个组的部分来解决这个问题。(我不确定是否也有合适的重复目标。)无论如何,到目前为止,我已经重新提出了这个问题,以寻求更广泛的解决方案。