SQL выбрать N-TOP строк с разными условиями

Помогите решить задачу. Есть база SQL на много тысяч строк Нужно сравнивая столбцы с числовыми значениями выбрать, например, 1000 строк. 500 строк где значение столбца А > значение столбца Б, 300 строк где А = Б и 200 где А < Б. Кроме этого 600 строк должны быть с суммой значений столбцов А + Б >=10, а 400 строк где А + Б < 10. Если делать так

select top(500) * frome base where a>b union select top(600) * frome base where (a+b)>=10

то я уже получаю строк где a>b больше чем мне нужно

Вопрос как составить запрос чтобы на выходе получить нужное количество строк с выполнением всех условий?


Ответы (1 шт):

Автор решения: Mike

Начать можно с того, что явно разбить записи на группы по условиям. Определим 2 набора групп: mm_g по первым условиям A <=> B, получаем 3 группы, первой пусть будет та где A < B. Второй набор групп s_g - две группы по значению суммы A+B. Далее явно определим количество записей для всех комбинаций групп mm_g и s_g. После чего остается выбрать нужное количество записей по каждой комбинации условий. Получается примерно так:

select *
  from (
      select *, row_number() over(partition by mm_g, s_g order by id) RN
        from (
           select *,
                  case when A < B then 1 when A=B then 2 else 3 end as mm_g,
                  case when a + b >= 10 then 1 else 2 end as s_g
             from test
        ) y
   ) X,
   (values(1, 1, 200*0.6), (1, 2, 200*0.4),
          (2, 1, 300*0.6), (2, 2, 300*0.4),
          (3, 1, 500*0.6), (3, 2, 500*0.4)
    ) as C(mm_g, s_g, cnt)
 where x.mm_g=C.mm_g and x.s_g=C.s_g and x.RN <= C.cnt

Если действительно необходимо соблюсти условие описанное в комментариях к вопросу как 2 (пропорционально уменьшить все выборки, в случае если в одной из них недостаточно записей). То можно выборку X заключить в with, получить из нее суммарное количество записей по группам и пересчитать количества в выборке C согласно этим количествам.

→ Ссылка