2012-05-22 3 views
0

Я застрял в этой проблеме. У меня есть дубликаты в моем запросе, исходящие из того, что некоторые из записей являются внутренними и внешними одновременно. Я предпочитаю работать снаружи, но некоторые из них предпочтительнее, когда нет входа из дома.внутренние записи за пределами записей

Выберите идентификатор, дата, место от прода

id date  location 
---------- 
2 01/01/2012 in-house 
2 05/01/2012 outside <- in this situation i want to keep just in-house 

id date  location 
---------- 
4 01/01/2012 in-house 
5 03/01/2012 outside <- in this situation i want to keep both since there is no db entry for id=5 therefor i have just info from outside 

Может кто-нибудь помочь?

+0

Можете ли вы изменить свой вопрос, возможно? Я не думаю, что ясно, какую проблему вы пытаетесь решить. – Dana

+0

Могу ли я попытаться пара-фразу? Вы хотите, чтобы одна запись была возвращена на 'id'? И это должно быть выбрано с 'location = outside', имеющим приоритет над' location = in-house'. И, я полагаю, если есть еще несколько записей для этого 'id', выберите тот, у которого наибольшее значение' date'? * [Также, какой бренд SQL вы используете? MySQL, SQL Server, Oracle? И какой выпуск/версия?] * – MatBailie

+0

Привет, у меня есть доступ к SQL Server. Если есть несколько rec для id, я бы хотел, чтобы максимальное значение даты и всегда выбиралось внутри дома за пределами. Извините, я знаю, что это не ясное объяснение, но вы правильно это понимаете. – grozny

ответ

1

Один из способов сделать это - сделать полное внешнее соединение из таблицы для себя, а затем использовать coalesce.

Select 
    COALESCE(Inside.Id, outside.id) Id, 
    COALESCE(Inside.date, outside.date) Date, 
    COALESCE(Inside.location, outside.location) Location 
From 
    prod Inside 
    FULL OUTER JOIN prod Outside 
    ON Inside.id = Outside.iD 
    and Inside.location <> Outside.Location 
Where 
    (Inside.Location = 'in-house' 
    or 
    Inside.Location is null) 
    and 
    (outside.Location = 'outside' 
    or 
    outside.Location is null) 

DEMO

Примечание:

Если ваши поля могут быть обнуляемым вы можете использовать саз вместо COALESCE и использовать поле ID, чтобы определить, какие таблицы использовать. Использование даты в качестве примера

CASE WHEN Inside.Id is not null THEN Inside.date ELSE outside.date END date 

Как отмечено Демс это также предполагает, что {id, location} является уникальным.

UPDATE

Так как вы используете SQL Server и {ID, Location} не является уникальным, и вы хотите, чтобы значение даты макс и всегда выбирают в доме над снаружи, то вы можете использовать ROW_NUMBER/WHERE RowNumber = 1 эффективно здесь , заказывая сначала по местоположению, а затем по дате.

WITH cte 
    AS (SELECT Row_number() OVER (partition BY ID 
       ORDER BY CASE LOCATION WHEN 'in-house' THEN 0 
             WHEN 'outside' THEN 1 END, 
         DATE DESC) rn, 
       ID, 
       Date, 
       Location 
     FROM prod) 
SELECT ID, 
     Date, 
     Location 
FROM cte 
WHERE rn = 1 

Demo

Примечание Мы не должны использовать случай заявление, но я хотел отображение быть явным.

+0

Предполагается, что 'id, location' уникален? – MatBailie

+0

@Dems да это –

+0

Конрад Фрикс - большое спасибо - применил его, и он работает - теперь мне нужно понять логику, но вы были здоровы. thx – grozny

Смежные вопросы