2016-02-09 2 views
3

необходимо сравнить значение двух столбцов и найти разницу между этим значением столбца, а в конце нужно отобразить все значения, присутствующие в этой таблице, где мы обнаруживаем максимальную разницуМаксимальное различие между двумя столбцами

 
companyname  open close date 
A     10  9.8 2015-01-01 
A     11  8.2 2015-02-01 
A    9.8  6.5 2015-02-04 
B     10  8  2015-04-01 
B     9.9 9.5 2015-04-15 
C     8.7 2.3 2015-02-01 

теперь я хочу запрос, который отображается выходная

 
company name open close difference date 
A    9.8  6.5  3.3  2015-02-04 
B     10  8  2  2015-04-01 
c     8.7  2.3 6.4  2015-02-01 

ответ

1

В качестве альтернативы автообъединение в @TimBiegeleisen's answer, вы можете использовать функцию кадрирования на заказ по разнице разделенной companyname, а затем выбрать первую строку из каждого раздела:

select [companyname] as [company name], [open], [close], [difference], [date] 
from (
    select [companyname], [open], [close], 
     [open] - [close] as [difference], [date], 
     row_number() over (partition by [companyname] 
          order by [open] - [close] desc) rn 
    from Table1 
) x 
where rn = 1 

[SQL Fiddle demo]

3

простого INNER JOIN из исходной таблицы в подзапрос получения максимальных различий для каждой компании все, что вам нужно.

SELECT c1.companyname, c1.open, c1.close, c2.maxTime AS difference, c1.date 
FROM companies c1 
INNER JOIN 
(
    SELECT companyname, MAX(open - close) AS maxTime 
    FROM companies 
    GROUP BY companyname 
) c2 
ON c1.companyname = c2.companyname AND (c1.open - c1.close) = c2.maxTime 

Перейдите по ссылке ниже для работающей демо:

SQLFiddle

+0

благодаря Тим Biegeleisen его рабочих –

+0

HII в настоящее время поскольку я внимательно наблюдаю за набором результатов, я обнаружил, что есть много компаний, которые выбираются несколько раз, любезно исправляя эту ошибку. –

+0

Я просто проверил свой запрос, используя скрипт SQL, предоставленный @lc. и он работает нормально. В чем же проблема? –

1

Try; (любезно @lc.)

select 
    [companyname], 
    [open], 
    [close], 
    [open] - [close] diff, 
    [date] 
From (
    select 
     [companyname], 
     [open], 
     [close], 
     [date], 
     rank() over (partition by [companyname] order by [open] - [close] desc) rnk 
    From my_table 
) x 
where rnk = 1 

sql fiddle demo

+0

в вышеуказанном запросе компания выбирается несколько раз ..... –

+0

Да, если несколько компаний имеют одинаковую максимальную разницу. Если это не то, что вы хотите, тогда используйте 'row_number' вместо' rank' – Praveen

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