Создание полного табличного представления с поиском минимального и максимального значения на основе групп столбцов - PullRequest
0 голосов
/ 24 августа 2018

У меня есть таблица t1 с 4 столбцами:

f1
f2
quant
rate

Мне нужно создать представление, которое содержит все записи в t1, но перечисляет значения min и max quant с соответствующимиrate для каждой f1 и f2 группы.

У меня есть решение ниже, но кажется, что это очень длинный обходной путь.Есть ли более простой способ достичь этих результатов в SQL Server 2014?

--Create min
    Select 
        a.f1
        ,a.f2
        ,b.min_quant
        ,a.rate As min_rate
    Into t1_min
    From t1 As a
    Inner Join (
        Select 
            f1
            ,f2
            ,MIN(quant) As min_quant
        From t1
        Group By f1, f2
    ) As b
        On a.f1 = b.f1
        And a.f2 = b.f2
        And a.quant = b.min_quant

--Create Max
    Select 
        a.f1
        ,a.f2
        ,b.max_quant
        ,a.rate As max_rate
    Into t1_max
    From t1 As a
    Inner Join (
        Select 
            f1
            ,f2
            ,MAX(quant) As max_quant
        From t1
        Group By f1, f2
    ) As b
        On a.f1 = b.f1
        And a.f2 = b.f2
        And a.quant = b.max_quant

--Create Final
    Select
    a.f1
    ,a.f2
    ,a.quant
    ,b.min_quant
    ,c.max_quant
    ,a.rate
    ,b.min_rate
    ,c.max_rate
    From t1 As a
    Left Join t1_min As b
        On a.f1 = b.f1
        And a.f2 = b.f2
    Left Join t1_max As c
        On a.f1 = c.f1
        And a.f2 = c.f2

Ответы [ 4 ]

0 голосов
/ 24 августа 2018

Принимая во внимание хорошие ответы из других ответов, я обнаружил Аналитические функции , которые создают желаемый вывод с помощью FIRST_VALUE () и LAST_VALUE ().

Select
    f1
    ,f2
    ,quant
    ,MIN(quant) Over(Partition By f1, f2) As min_quant
    ,MAX(quant) Over(Partition By f1, f2) As max_quant
    ,rate
    ,FIRST_VALUE(rate) Over(Partition By f1, f2 Order By quant) As min_rate
    ,LAST_VALUE(rate) Over(Partition By f1, f2 Order By quant RANGE Between CURRENT ROW And UNBOUNDED FOLLOWING) As max_rate
From t1
Order By f1, f2, quant
0 голосов
/ 24 августа 2018

Вам нужно было бы отбросить эти t1_min и t1_max и каждый раз создавать заново.

Это более простой способ, ИМХО (но ваши требования расплывчаты, что происходит, например, при наличии нескольких значений min \ max. В любом случае.это как минимум соответствует полученному результату):

SELECT f1, f2, quant, 
  min_quant, min_rate,
  max_quant, max_rate
FROM dbo.t1 t
CROSS APPLY (SELECT MIN(quant), MAX(quant) 
    FROM t1 tt WHERE t.f1=tt.f1 AND t.f2=tt.f2) tm(min_quant, max_quant)
CROSS APPLY (SELECT rate FROM t1 tt 
    WHERE t.f1=tt.f1 AND t.f2=tt.f2 AND tt.quant = tm.min_quant) tminr(min_rate)
CROSS APPLY (SELECT rate FROM t1 tt 
    WHERE t.f1=tt.f1 AND t.f2=tt.f2 AND tt.quant = tm.max_quant) tmaxr(max_rate);
0 голосов
/ 24 августа 2018

Вы можете создать нумерацию в обоих направлениях (по возрастанию и по убыванию), и из обеих нумераций выбрать число 1 при присоединении пронумерованных записей к t1:

WITH
  minmax (f1, f2, quant, rate, rn_min, rn_max) AS (
    SELECT f1, f2, quant, rate,
      ROW_NUMBER() OVER (PARTITION BY f1, f2 ORDER BY quant ASC),
      ROW_NUMBER() OVER (PARTITION BY f1, f2 ORDER BY quant DESC)
    FROM t1
  )
SELECT t1.f1, t1.f2, t1.quant, t1.rate,
  mi.quant AS min_quant, mi.rate AS min_rate,
  ma.quant AS max_quant, ma.rate AS max_rate
FROM t1
  INNER JOIN minmax mi ON t1.f1 = mi.f1 AND t1.f2 = mi.f2 AND mi.rn_min = 1
  INNER JOIN minmax ma ON t1.f1 = ma.f1 AND t1.f2 = ma.f2 AND ma.rn_max = 1
0 голосов
/ 24 августа 2018

Я думаю, что оконные функции будут делать:

select
    f1, f2,
    quant,
    min(quant) over(partition by f1, f2) as min_quant,
    max(quant) over(partition by f1, f2) as max_quant,
    rate,
    min(rate) over(partition by f1, f2) as min_rate,
    max(rate) over(partition by f1, f2) as max_rate,
  from t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...