2015-09-04 3 views
0

У меня есть следующие таблицыSQL Query объединить несколько результатов или объединения таблиц

Планировка Таблица

Dis_ID | OfferID | RequestID 
------------------------------------ 
34564 | 123  | 9 
77456 | 123  | 8 
25252 | 124  | 7 
46464 | 125  | 10 
36464 | 125  | 6 
35353 | 125  | 5 

Запрос Таблица

RequestID | AccountNum | 
--------------------------- 
5   | 548543  | 
6   | 548543  | 
7   | 684567  | 
8   | 684567  | 
9   | 684567  | 
10   | 548543  | 
11   | 684567  | 

Ранг Таблица

RankID | OfferId | RequestID | Score 
------------------------------------------- 
34564 | 123  | 11  | 1 
77456 | 124  | 11  | 2 
25252 | 125  | 11  | 3 

Используя данные выше мне нужен запрос, который будет вести себя следующим образом дали номер запроса смотреть на каждую запись в ранговой таблице в этом примере мы имеем 3 (123, 124, & 125). верните OfferId, который появляется в таблице Disposition меньше всего раз для этого объединенного номера учетной записи. в этом примере offer ID 123 появляется дважды для этого номера учетной записи, offerId 124 появляется один раз, и offer 125 не появляется вообще для этого номера учетной записи. Поэтому offerId 125 должно быть возвращено. Предложение, которое существует в таблице ранга с наименьшими показаниями в таблице Disposition, всегда должно быть возвращено, если они не являются одинаковыми, а затем возвращают предложение с наименьшим значением в поле «Оценка». например, если ни один из offerIDs не появился в таблице Dispostion offerId 123 вернется, так как его показатель значение 1.

результирующая таблица будет выглядеть как этот

| OfferId | Score | Dis_Occurrences 
--------------------------------------------------------------- 
| 123  | 1 | 2 
| 124  | 2 | 1 
| 125  | 3 | 0  <--Return this record 

Это то, что я так далеко.

SELECT oRank.OfferId, oRank.Rank_Number, count(oRank.OfferId) AS NumDispositions 
From Rank oRank 
join Request req 
on oRank.RequestId = req.RequestId 
join Disposition dis 
on oRank.OfferId = dis.OfferId 
where req.Customer_Account_Number = 684567 and req.RequestId = 11 and oRank.OfferId = dis.OfferId 
group by oRank.Rank_Number, oRank.OfferId 
order by NumDispositions, oRank.Rank_Number 

Моя некорректный Результирующая таблица выглядит следующим образом

| OfferId | Score | Dis_Occurrences 
--------------------------------------------------------------- 
| 123  | 1 | 2 
| 124  | 2 | 1 
| 125  | 3 | 3  

Он рассчитывает общее число раз offerId появляется в диспозиции таблице

+0

Sql сервер или MySQL? –

+0

@GiorgiNakeuri Я использую MicrosoftSQL. –

+0

Каким образом должны быть объединены таблицы Rank и Disposition? В вашем примере запроса вы присоединяетесь к ним с помощью RequestID, но в данных примера, которые вы опубликовали, нет общих идентификаторов RequestID. Может быть, вы хотели присоединиться к OfferID вместо этого? – beercohol

ответ

1

EDIT - на основе автора комментарии, вот еще одна версия:

Пример в SQLFiddle: http://sqlfiddle.com/#!6/d3f99/1/0

with RankReqMap as (
    select rnk.OfferId, rnk.Score, reqAcct.AccountNum, reqReq.RequestID 
    from   [Rank] rnk 
     left join Request reqAcct on reqAcct.RequestID = rnk.RequestID 
     left join Request reqReq on reqReq.AccountNum = reqAcct.AccountNum 

    where rnk.RequestID = 11 -- Put your RequestId filter here 
) 
select oRank.OfferId 
     ,oRank.Score 
     ,count(dis.RequestID) as NumDispositions 
from   RankReqMap oRank 
    left join Disposition dis on dis.OfferID = oRank.OfferId 
           and dis.RequestID = oRank.RequestID 
group by oRank.OfferId , oRank.Score 
order by NumDispositions, oRank.Score; 

ОРИГИНАЛЬНЫЙ ПОСТ

Пример в SQLFiddle: http://sqlfiddle.com/#!6/770a8/1/0

Этот запрос делает предположение о том, что вы соединяющую Disposition ранжировать на основе OfferID , так как RequestID для этих таблиц в ваших примерах не совпадают.Вы, возможно, придется настроить в зависимости от ваших потребностей, но что-то вроде ниже запроса вы должны получить запись, которую вы ищете:

-- Gather base data 
with RankData as (
    select rnk.RankID 
      ,rnk.OfferID 
      ,rnk.RequestID 
      ,rnk.Score 
      ,Dis_Occurrences = count(dis.OfferID) 
    from   dbo.[Rank]  rnk 
     left join dbo.Disposition dis on dis.OfferID = rnk.OfferId 
     left join dbo.Request  req on req.RequestID = rnk.RequestID 
    group by rnk.RankID, rnk.OfferID, rnk.RequestID, rnk.Score 
) 
-- Rank count of Dis_Occurrences, taking lowest score into account as a tie breaker 
, DispRanking as (
    select rdt.*, Dis_Rank = row_number() over (order by Dis_Occurrences asc, rdt.Score asc) 
    from RankData rdt 
) 
-- Return only the value with the highest ranking 
select * from DispRanking where Dis_Rank = 1 

Заметим также, что если преобразовать второй КТР в обнаженный SELECT, и удалите ЗЕЬЕСТ в конце концов, вы можете увидеть все записи и функции, как они получают ранжируются по row_number():

-- Gather base data 
with RankData as (
    select rnk.RankID 
      ,rnk.OfferID 
      ,rnk.RequestID 
      ,rnk.Score 
      ,Dis_Occurrences = count(dis.OfferID) 
    from   dbo.[Rank]  rnk 
     left join dbo.Disposition dis on dis.OfferID = rnk.OfferId 
     left join dbo.Request  req on req.RequestID = rnk.RequestID 
    group by rnk.RankID, rnk.OfferID, rnk.RequestID, rnk.Score 
) 
-- Output all values, with rankings 
select rdt.*, Dis_Rank = row_number() over (order by Dis_Occurrences asc, rdt.Score asc) 
from RankData rdt 

Успехов!

+0

Спасибо за ответ !!! Ваше предположение является правильным предложением. Я бы очень хотел, чтобы к ним присоединился мой обновленный мой запрос. Я думаю, что я смутил всех, когда мой первый запрос был так испорчен. Я должен использовать предоставленный RequestID. Это скажет мне, какие записи нужно извлечь из таблицы Rank. Я также должен использовать номер учетной записи, чтобы косвенно найти список записей удаления, которые имеют RequestId, которые вернутся к указанному номеру учетной записи в таблице Request. Я попробовал ваше решение, но у меня были неправильные результаты. На самом деле он не нашел ни одного подходящего предложения в таблице Rank с таблицей Disposition. –

+0

Можете ли вы уточнить свои исходные таблицы? В запросе, который вы указали, вы ссылаетесь на oRank.Rank_Number, который нигде не отображается в ваших данных. Я также предполагаю, что Customer_Account_Number из Request должен быть AccountNum на основе ваших данных ... –

+0

Сделал пару предположений и разместил обновленную версию, которая отображает ваше нулевое значение вверху. Посмотрите, работает ли это для вас. –

0

Я думаю, вы можете использовать функцию окна для этого:

;with disp as(select offerid, count(*) as ocount 
       from dispositions group by offerid), 
rnk as(select r.offerid, 
       row_number() over(partition by r.requestid 
           order by isnull(d.ocount, 0), r.score) rn 
     from ranks r 
     left join disp d on r.offerid = d.offerid) 
select * from rnk where rn = 1 
Смежные вопросы