Есть ли способ получить первый ряд после UNION? - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь получить наиболее повторяющиеся значения в двух столбцах для меня, этот запрос работает нормально, и я получаю результаты, как и ожидалось. Но я только хочу, чтобы в первом ряду можно было получить это с ROWNUM = 1? Или что-то похожее?

Моя среда Oracle 11 и SQL Разработчик.

Мой код:

SELECT AIR_ARB, COUNT(*) FROM
(
SELECT AIR_ARB FROM AIR_INFO  WHERE  V_VX IN (910208,910209,9......) AND V_Y IN
(826369,826370,8.....)
UNION ALL
SELECT AIR_MAT FROM AIR_INFO WHERE  V_VX IN (910208,910209,9......) AND V_Y IN 
(826369,826370,8.....)

) t
GROUP BY AIR_ARB
ORDER BY COUNT (*) desc

Мои результаты:

AIR_ARB COUNT(*)
null     64
100      23
0        20
72       15
143       3
43        3

Ответы [ 3 ]

1 голос
/ 27 января 2020

Вы также можете ограничить результаты, используя процент ниже, добавьте выражение ниже после "ORDER BY"

 FETCH FIRST 0.01 PERCENT ROWS ONLY
1 голос
/ 27 января 2020

Если ваши списки IN идентичны, вы можете использовать UNPIVOT, затем GROUP BY и ORDER BY и затем фильтровать по WHERE ROWNUM = 1 после заказа.

Это означает, что вам нужно только написать списки один раз (что облегчает отладку и обслуживание запроса) и Oracle нужно только один раз отсканировать таблицу / индекс AIR_INFO (тогда как UNION может использовать два сканирования).

SELECT *
FROM   (
  SELECT value AS air_arb,
         COUNT(*)
  FROM   AIR_INFO
  UNPIVOT ( value FOR type IN ( AIR_ARB, AIR_MAT ) )
  WHERE  V_VX IN (910208,910209)
  AND    V_Y  IN (826369,826370)
  GROUP BY value
  ORDER BY COUNT(*) DESC
)
WHERE rownum = 1;

Итак для тестовых данных:

CREATE TABLE air_info ( v_vx, v_y, air_arb, air_mat ) AS
SELECT 910208, 826369, 1, 2 FROM DUAL UNION ALL
SELECT 910209, 826370, 3, 2 FROM DUAL;

это выводит:

AIR_ARB | COUNT(*)
------: | -------:
      2 |        2

db <> Fiddle здесь

1 голос
/ 27 января 2020

Вам нужен дополнительный подзапрос:

SELECT a.*
FROM (SELECT AIR_ARB, COUNT(*) as cnt
      FROM (SELECT AIR_ARB FROM AIR_INFO  WHERE  V_VX IN (910208,910209,9......) AND V_Y IN (826369,826370,8.....)
            UNION ALL
            SELECT AIR_MAT FROM AIR_INFO WHERE  V_VX IN (910208,910209,9......) AND V_Y IN(826369,826370,8.....)
           ) t
      GROUP BY AIR_ARB
      ORDER BY COUNT (*) desc
     ) a
WHERE rownum = 1;
...