2015-07-05 2 views
1

Я был в состоянии создать следующий запрос после помощи от должности нижесаз внутри подзапроса

select * from duppri t 
where exists (
    select 1 
    from duppri 
    where symbolUP = t.symbolUP 
    AND date = t.date 
    and price <> t.price) 
    ORDER BY date 

SQL to check when pairs don't match

Теперь я понял, что мне нужно добавить случай заявление, чтобы указать, когда все приведенные выше критерии подходят, но значение типа равно между duppri и t.uppri. Это происходит из-за чувствительности к регистру. Этот запрос представляет собой попытку очистки системы учета портфеля, которая, к сожалению, допускает многочисленные дубликаты, поскольку она не имеет сильной ссылочной целостности или ограничений.

Я хотел бы случай заявления для получения столбца «isMatch»

Date  |Type|Symbol |SymbolUP |Concatt  |Price |IsMatch 
6/30/1995 |gaus|313586U72|313586U72|gaus313586U72|109.25|Different 
6/30/1995 |gbus|313586U72|313586U72|gbus313586U72|108.94|Different 
6/30/1995 |agus|SRR  |SRR  |agusSRR  |10.25 |Different 
6/30/1995 |lcus|SRR  |SRR  |lcusSRR  |0.45 |Different 
11/27/1996|lcus|LLY  |LLY  |lcusLLY  |76.37 |Matched 
11/27/1996|lcus|lly  |LLY  |lcusLLY  |76 |Matched 
11/28/1996|lcus|LLY  |LLY  |lcusLLY  |76.37 |Matched 
11/28/1996|lcus|lly  |LLY  |lcusLLY  |76 |Matched 

Я попробовал следующее сазе, но он создает ошибку

SELECT * from duppri t 
where exists (
    select 1, 
    CASE IsMatch WHEN [type] = [t.TYPE] THEN 'Matched' ELSE 'Different' END 
    from duppri 
    where symbolUP = t.symbolUP 
    AND date = t.date 
    and price <> t.price) 

    ORDER BY date 
+0

Когда вы даете '' CASE' как SELECT * FROM [таблица] WHERE [столбец] <> [колонка] ', как ты ожидать, что он вернет любые значения? Что именно ты пытаешься сделать? –

+0

Этот запрос работает. Я хочу, чтобы это было тематическое заявление выберите * от duppri т где существует ( выберите 1 из duppri где symbolUP = t.symbolUP И тип = t.type И дата = t.date и цена <> т .price) ORDER BY date –

+0

На самом деле это работает, если вы разместите его в качестве ответа. Я помету его как ответ. –

ответ

2

Вы могли бы просто использовать окно функции, если я правильно понимаю:

select d.*, 
     (case when mint = maxt 
      then 'Matched' else 'Different' 
     end) 
from (select d.*, 
      min(type) over (partition by symbolup, date) as mint, 
      max(type) over (partition by symbolup, date) as maxt, 
      min(price) over (partition by symbolup, date) as minp, 
      max(price) over (partition by symbolup, date) as maxp 
     from duppri d 
    ) d 
where minp <> maxp 
order by date; 
+0

Это выглядит действительно лучше. – jpw

+0

Я должен сказать, что это действительно полезно. –

0

подзапрос используется с существует предикат может 't и не вернет ничего, кроме true/false, но вы можете выполнить то, что хотите, с помощью такого подзапроса, который должен работать:

select 
    *, 
    (select 
    CASE when count(distinct type) = 1 THEN 'Matched' ELSE 'Different' END 
    from duppri 
    where symbol = t.symbol and date = t.date 
) IsMatch 
from duppri t 
where exists (
    select 1 
    from duppri 
    where symbol = t.symbol 
    and price <> t.price);