2013-06-18 2 views
0

у меня есть некоторые данные в базе данных:Выберите все данные, без дублирования данных

Имени | Страна | Статус

Mary | США | Ожидает подтверждения

Джейн | Япония | Ожидает подтверждения

Джейн | Корея | Ожидает подтверждения

Adrian | Китай | Ожидает подтверждения

Peter | Сингапур | Ожидает подтверждения

Джек | Малайзия | Ожидает подтверждения

Adrian | Китай | Обновлено

Джейн | Япония | Updated

Могу ли я узнать, как использовать запрос SELECT для выбора всех данных без дубликатов данных? (Если имеются данные дублирования, выберите только статус с обновленным)

+2

Это зависит от того, какие поля вы считаете: экс , должен ли быть принят «статус» или нет? –

+0

^у этой же мысли – felickz

+0

Все поля, которые мне также нужно учитывать. В приведенном выше примере я хочу выбрать Мэри, Джейн (из Кореи), Питера, Джека, Адриана (из обновленного статуса) и Джейн (из обновленного статуса) – Ian

ответ

1

Try:

SELECT Name, Country, MAX(Status) as Status FROM (
SELECT TOP 100 PERCENT * 
FROM NameCountry 
ORDER BY Name ASC, Country ASC, Status DESC 
) G 
GROUP BY G.Name, G.Country 
ORDER BY G.Name, G.Country 

Проверьте мой Demo

+0

Спасибо. Могу ли я знать, почему нужно использовать «ТОП 100 ПРОЦЕНТОВ»? Извините, потому что я новичок в sql. – Ian

+1

@Ian Если у вас есть внутренний запрос или дополнительный запрос, и вы используете ORDER BY, вам нужно использовать предложение TOP, иначе оно не сработает. И сделайте это на 100%, чтобы он показывал все. – Edper

+0

Хорошо. Большое спасибо. – Ian

0

Из вашего комментария, вы, кажется, имеете в виду только данные, в которых дублируются первые два столбца. Самый простой способ, я думаю, заключается в использовании row_number(), который доступен в большинстве баз данных:

select name, country, status 
from (select t.*, 
      row_number() over (partition by name, country 
           order by (case when status = 'Pending' then 0 else 1 end) 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1 
Смежные вопросы