Как вернуть только 1 строку, если несколько повторяющихся строк и все еще возвращают строки, которые не являются дубликатами? - PullRequest
6 голосов
/ 18 сентября 2009

У меня есть соблазн, который выглядит так:

RequestID   | CreatedDate          | HistoryStatus           
CF-0000001  | 8/26/2009 1:07:01 PM | For Review   
CF-0000001  | 8/26/2009 1:07:01 PM | Completed  
CF-0000112  | 8/26/2009 1:07:01 PM | For Review   
CF-0000113  | 8/26/2009 1:07:01 PM | For Review  
CF-0000114  | 8/26/2009 1:07:01 PM | Completed  
CF-0000115  | 8/26/2009 1:07:01 PM | Completed   

И как бы я хотел, чтобы стол в конце выглядел так:

RequestID   | CreatedDate          | HistoryStatus           
CF-0000001  | 8/26/2009 1:07:01 PM | Completed  
CF-0000112  | 8/26/2009 1:07:01 PM | For Review  
CF-0000113  | 8/26/2009 1:07:01 PM | For Review  
CF-0000114  | 8/26/2009 1:07:01 PM | Completed  
CF-0000115  | 8/26/2009 1:07:01 PM | Completed

т.е. дубликат CF-0000001 должен быть удален.

Как я могу вернуть или я должен выбрать выбрать только ОДНУ строку, если есть несколько повторяющихся строк и все еще возвращаются строки, которые не являются дубликатами?

Ответы [ 9 ]

11 голосов
/ 18 сентября 2009

Попробуйте, если вы хотите отобразить одну из повторяющихся строк на основе RequestID и CreatedDate и показать последний HistoryStatus.

with t as (select row_number()over(partition by RequestID,CreatedDate order by RequestID) as rnum,* from tbltmp)
Select RequestID,CreatedDate,HistoryStatus from t a where  rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID)

или если вы хотите выбрать одну из повторяющихся строк, учитывая только CreatedDate, и показать последний HistoryStatus, то попробуйте запрос ниже.

with t as (select row_number()over(partition by CreatedDate order by RequestID) as rnum,* from tbltmp)
Select RequestID,CreatedDate,HistoryStatus from t  where  rnum = (SELECT Max(rnum) FROM t)

Или, если вы хотите выбрать одну из повторяющихся строк с учетом только идентификатора запроса и показать последний HistoryStatus, используйте запрос ниже

with t as (select row_number()over(partition by RequestID order by RequestID) as rnum,* from tbltmp)
Select RequestID,CreatedDate,HistoryStatus from t a where  rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID)

Все вышеперечисленные запросы я написал в sql server 2005.

5 голосов
/ 18 сентября 2009

Судя по названию, вам нужен только один результат на уникальную строку? Если это так, взгляните на предложение GROUP BY (или SELECT DISTINCT ).

4 голосов
/ 18 сентября 2009
select t.*
from (
    select RequestID, max(CreatedDate) as MaxCreatedDate
    from table1
    group by RequestID
) tm
inner join table1 t on tm.RequestID = t.RequestID and tm.MaxCreatedDate = t.CreatedDate
3 голосов
/ 18 сентября 2009

Если в вашем запросе есть отношение один ко многим, на одной стороне могут возникнуть повторяющиеся строки.

Предположим, что следующее

TABLE TEAM
ID       TEAM_NAME
0        BULLS
1        LAKERS


TABLE PLAYER
ID       TEAM_ID     PLAYER_NAME
0        0           JORDAN
1        0           PIPPEN

И вы выполняете запрос как

SELECT 
    TEAM.TEAM_NAME, 
    PLAYER.PLAYER_NAME 
FROM TEAM
INNER JOIN PLAYER

Вы получите

TEAM_NAME   PLAYER_NAME
BULLS       JORDAN
BULLS       PIPPEN

Таким образом, у вас будет дубликат ИМЯ КОМАНДЫ. Даже при использовании предложения DISTINCT ваш набор результатов будет содержать дубликат ИМЯ КОМАНДЫ

Так что, если вы не хотите, чтобы в вашем запросе был дубликат TEAM_NAME, выполните следующее

SELECT ID, TEAM_NAME FROM TEAM

И для каждой найденной команды ID выполняет

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE>

Таким образом, вы не получите дубликаты ссылок на одной стороне

С уважением,

0 голосов
/ 19 марта 2018

с использованием пространств имен и подзапросов Вы можете сделать это:

declare @data table (RequestID varchar(20), CreatedDate datetime, HistoryStatus varchar(20))
insert into @data values ('CF-0000001','8/26/2009 1:07:01 PM','For Review');
insert into @data values ('CF-0000001','8/26/2009 1:07:01 PM','Completed');  
insert into @data values ('CF-0000112','8/26/2009 1:07:01 PM','For Review');   
insert into @data values ('CF-0000113','8/26/2009 1:07:01 PM','For Review');  
insert into @data values ('CF-0000114','8/26/2009 1:07:01 PM','Completed');  
insert into @data values ('CF-0000115','8/26/2009 1:07:01 PM','Completed');

select d1.RequestID,d1.CreatedDate,d1.HistoryStatus 
from @data d1 
where d1.HistoryStatus = 'Completed'
union all 
select d2.RequestID,d2.CreatedDate,d2.HistoryStatus 
from @data d2 
where d2.HistoryStatus = 'For Review' 
    and d2.RequestID not in (
        select RequestID 
        from @data 
        where HistoryStatus = 'Completed' 
            and CreatedDate = d2.CreatedDate
    )

Выше запроса возвращает

CF-0000001, 2009-08-26 13:07:01.000,    Completed
CF-0000114, 2009-08-26 13:07:01.000,    Completed
CF-0000115, 2009-08-26 13:07:01.000,    Completed
CF-0000112, 2009-08-26 13:07:01.000,    For Review
CF-0000113, 2009-08-26 13:07:01.000,    For Review
0 голосов
/ 06 июля 2017

попробуйте использовать выделенный х. * Из ( ваш запрос )

Спасибо.

0 голосов
/ 05 сентября 2016
select * from temptable
where rnum --unique key
 in 

( 
 SELECT RNUM --unique key
  FROM temptable
 WHERE (  HistoryStatus
) IN (SELECT                HistoryStatus

                             FROM temptable
                            GROUP BY                
HistoryStatus 
                           HAVING COUNT(*) <= 1));

Я не проверял этот код. Я использовал подобный код, и он работает. Синтаксис в Oracle.

0 голосов
/ 05 августа 2013

Чтобы извлечь только одну отдельную запись из дублирующего столбца из двух строк, вы можете использовать столбец «rowid», который поддерживается самим оракулом в качестве первичного ключа, поэтому сначала попробуйте

"select rowid,RequestID,CreatedDate,HistoryStatus  from temptable;"

и затем вы можете получить вторую строку только по значению столбца rowid, используя инструкцию SELECT.

0 голосов
/ 18 сентября 2009

Если это вопрос SQL, и я понимаю, о чем вы спрашиваете (это не совсем понятно), просто добавьте отличное к запросу

   Select Distinct * From TempTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...