Выберите конкретную запись, используя регистр, как будто - PullRequest
0 голосов
/ 24 сентября 2019

Попытка выбрать уникальные данные из таблицы, содержащей несколько записей для одного и того же идентификатора.

Я в основном пытаюсь получить данные security_name для всех идентификаторов безопасности, представленных в option_price_view.

Security_nameимеет несколько записей для одного идентификатора безопасности, последний для некоторых имеет тикер "ZZZZ" или ноль.Я хочу подготовить это так, чтобы, если есть только одна запись, возьмите ее, какой бы она ни была.Если их несколько, извлеките одно с самой поздней датой, и тикер не равен нулю, или <> "ZZZZ"

в таблице security_name есть следующие поля: Securityid, тикер, дата, описание эмитента

Я пробовал несколько вложенных выборок, чтобы попытаться отфильтровать "ZZZZ" или нулевые значения, но я не понимаю синтаксис для числа записей IF = 1, выберите его, иначе выберите следующую запись, упорядоченную по дате.

select * from security_name 
where securityid in 
(
    select distinct securityid 
    from option_price_view
)
and ticker <> "ZZZZ"
and ticker is not null

Что здесь происходит, так это то, что любые записи в security_name, у которых нет нескольких записей, не будут заполняться.

ОБНОВЛЕНИЕ =================================================

Результат запроса

Результат таблицы Security_Name для этого идентификатора безопасности

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Ну, я думаю, что вы хотите включить строки, где тикер равен нулю или 'ZZZZ', если они являются ЕДИНСТВЕННОЙ строкой.Если это так, я предложил следующее.

Это UNTESTED и может иметь синтаксические ошибки.

Комментарии встроены.

select * -- You will probably want to enumerate the relevant columns because this will also return the rown number column
from ( -- I use 2 paremeters for order by so that ticker is null and ticker = 'zzzz' are the lowest priority
   select SN.*, row_number() over ( partition by securityid
                              order by case when isnull(ticker,'ZZZZ') = 'ZZZZ' then 1 else 0 end,
                              date desc ) rownum
   from security_name SN
   inner join ( -- I like to inner join but this could be in the where clause "where in" or "where exists"
      select distinct securityid
      from option_price_view
   ) OPV on OPV.securityid = SN.securityid
) SN_a -- This completes the subquery returning everything ordered by our desired priority
where rownum = 1 -- This limits the output to the single highest priority record for each securityid
0 голосов
/ 24 сентября 2019

Следующий запрос не самый производительный, но я думаю, что он делает то, что вы хотите:

select top (1) with ties sn.*
from security_name sn
where sn.securityid in (select opv.securityid from option_price_view opv) and
      sn.ticker <> 'ZZZZ'  -- gets rid of NULL values too
order by row_number() over (partition by sn.securityid order by date desc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...