2014-02-06 2 views
1

У меня есть таблица, имеющие coloumns,Сравните группу строк в оракула

ID |  BRANCH |  START_NUM  | END_NUM 
123    S     25    95 
234    S     45    105 
445    S     46    90 
556    M     56    129 
78    M     76    199 
87    M     80    110 
987    M     89    128 
777    M     100    1500 

Я хочу первой группе мой результат на основе BRANCH (M, S Здесь) .Затем я хочу только те записи, которая лежит insubset MASTER START AND END NO, который является первым рядом группы. Здесь я буду сравнивать группу S с 25-95 и в M группой с 56-129. Поэтому ответ (я просто написание строк первый элемент)

123 
445 
556 
87 
+0

Что вы имеете в виду под «первой строкой группы»? Вы имеете в виду тот, у кого самый низкий «START_NUM»? –

+1

Почему бы не «987» быть в результирующем наборе? –

ответ

0

Вы можете использовать ниже данный запрос в MSSQL.

SELECT B.ID FROM Branch B 
INNER JOIN (
     SELECT DISTINCT M.BRANCH,C.START_NUM,C.END_NUM 
     FROM BRANCH M 
     OUTER APPLY(
      SELECT TOP 1 START_NUM,END_NUM 
      FROM Branch 
      WHERE BRANCH = M.BRANCH 
      ORDER BY START_NUM 
     ) C 
) L ON B.BRANCH = L.BRANCH AND B.START_NUM >= L.START_NUM AND B.END_NUM <= L.END_NUM 
0

Если я правильно Вас понял (я думаю, что я делаю) и предполагая, что «первая строка из группы» соответствует start_num порядке, то вы можете попробовать:

SELECT ID, BRANCH, START_NUM, END_NUM 
FROM 
(SELECT ID, BRANCH, START_NUM, END_NUM 
, min(START_NUM) keep (dense_rank FIRST ORDER BY START_NUM) over (partition BY BRANCH) st 
, min(END_NUM) keep (dense_rank FIRST ORDER BY START_NUM) over (partition BY BRANCH) en 
FROM table1) t 
WHERE t.START_NUM >= t.st AND t.END_NUM <= t.en 

Here is a sqlfiddle demo

+0

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

+0

Возможно, из-за '" "' удалить их и попробовать еще раз (я также обновил свой ответ) –

0

(1) Как вы определяете «первую» строку для группы? Я предполагаю, что это строка с наименьшим стартовым номером для этой ветви.

(2) Если есть галстук, например, скажем, для вашей группы М, есть 2 строки с одинаковым стартовым номером, но другой конечный номер. Будет ли диапазон соответствовать значению начала и конца строки, имеющей наивысшее конечное значение, или наименьшее конечное значение?

Ответ на вопрос № 2 выше важен, поэтому я дам вам sql для обоих.

Если вы хотите самую низкую END_NUM где есть 2+ строки в той же отрасли с тем же START_NUM

with boundaries as(
select id, branch, start_num, end_num 
from tbl y 
where start_num = (select min(x.start_num) from tbl x where x.branch = y.branch) 
    and end_num = (select min(x.end_num) from tbl x where x.branch = y.branch and x.start_num = y.start_num) 
) 
select x.* 
from tbl x join boundaries y on x.branch = y.branch 
where x.start_num >= y.start_num 
    and x.end_num <= y.end_num 

Если вы хотите высокий END_NUM где есть 2+ строки в одной и той же ОТРАСЛИ с тем же START_NUM

with boundaries as(
select id, branch, start_num, end_num 
from tbl y 
where start_num = (select min(x.start_num) from tbl x where x.branch = y.branch) 
    and end_num = (select max(x.end_num) from tbl x where x.branch = y.branch and x.start_num = y.start_num) 
) 
select x.* 
from tbl x join boundaries y on x.branch = y.branch 
where x.start_num >= y.start_num 
    and x.end_num <= y.end_num 
Смежные вопросы