2010-12-20 1 views
1
WITH test_data AS (
    SELECT 1 key, 1 a, 2 b FROM dual UNION ALL --# Lowest a for key=1 
    SELECT 1 key, 2 a, 1 b FROM dual UNION ALL 
    SELECT 2 key, 3 a, 3 b FROM dual UNION ALL --# Lowest a for key=2, lowest b 
    SELECT 2 key, 3 a, 4 b FROM dual UNION ALL 
    SELECT 2 key, 4 a, 5 b FROM dual 
) 

Я пытаюсь группе key, и получить самую низкую a и соответствующего b (низкий b в случае связей), а также сумма его b с:Получение наименьшие значения в GROUP BY

 KEY   A FIRST_B  SUM_B 
---------- ---------- ---------- ---------- 
     1   1   2   3 
     2   3   3   12 

Я понимаю, что это с суб-выберите

SELECT key, MIN(a) AS a, first_b, SUM(b) AS sum_b 
FROM (
    SELECT key, a, b, 
     FIRST_VALUE(b) OVER (PARTITION BY key ORDER BY a, b) AS first_b 
    FROM test_data 
) 
GROUP BY key, first_b 

, но мне интересно, если есть способ, чтобы избежать суб-выбора, то л икэ

SELECT key, a, SUM(b) AS sum_b, 
     MIN(FIRST_VALUE(b) OVER (PARTITION BY key ORDER BY a, b)) AS first_b 
FROM test_data 
GROUP BY key, a 

который поднимает ORA-30483: оконные функции здесь не допускается


Заранее спасибо, Питер

+0

Есть Есть особая причина, почему вы нужно избегать подвыборки? Это то, что у вас недостаточно. –

+0

@MatthewWatson: Прямо сейчас, производительность не проблема. Запрос довольно сложный, и повторная ввод всех выбранных столбцов подвыборки - это то, что я пытался избежать по соображениям удобочитаемости. –

+0

Создайте для этого представление или используйте псевдоним. * Вы хотите все столбцы. Я сомневаюсь, что любые фанковые решения станут более читаемыми. –

ответ

4

Вы ищете first/последние агрегатных функций? Из-за функции MIN, упорядочение по B в столбце first_b должно быть избыточным, но это, вероятно, зависит от того, как именно вы собираетесь его использовать.

WITH test_data AS (
    SELECT 1 key, 1 a, 2 b FROM dual UNION ALL --# Lowest a for key=1 
    SELECT 1 key, 2 a, 1 b FROM dual UNION ALL 
    SELECT 2 key, 3 a, 3 b FROM dual UNION ALL --# Lowest a for key=2, lowest b 
    SELECT 2 key, 3 a, 4 b FROM dual UNION ALL 
    SELECT 2 key, 4 a, 5 b FROM dual 
) 
select 
    key, 
    min(a) as a, 
    min(b) keep (dense_rank first ORDER BY a, b) as first_b, 
    SUM(b) AS sum_b 
FROM test_data 
GROUP BY key 
+0

+1 выражение KEEP (...) очень хорошее решение –

+0

Да, это именно то, что я искал :) Раньше я использовал его, но, похоже, забыл об этом ... Большое спасибо! –

0

Я думаю, что вы, вероятно, также называют идею ниже суб-выбора (или 2 подзапросы), но попробовать его в любом случае.
В противном случае вам не повезло, так как вы хотите, чтобы вы выполняли две разные группы по совокупности, одну по одному ключу и одну по ключу и по атрибуту a. И вы не можете делать две разные группы по совокупности в одном выражении SQL. Таким образом, вам нужно как минимум два разных оператора SQL, которые, очевидно, должны быть скомбинированы. И нет никакого способа, чтобы объединить два результирующих из двух различных SQL statments в один без лечения одного или другого (или оба) в качестве суб-выбора одного вида или другого)

Select X.key, X.a, y.firstBm X.sum_b 
    From 
    (SELECT tda.key, MIN(tda.a) a, 
     Min(case tdb.b) firstB, 
     SUM(tda.b) sum_b 
     FROM test_data tda 
     Group By key) X 
    Left Join 
     (Select tda.key, a, 
     Min(b) firstB 
     FROM test_data  
     Group By key, a) Y 
    On Y.key = X.key 
     And Y.a = X.a 

 Смежные вопросы

  • Нет связанных вопросов^_^