2016-04-05 14 views
0

Bunu yapmam lazım ama bilmiyorum. Bu masam var.Ayda en yüksek maaşlı satırları al ve yıl

SSN | SALARY | MONTH YEAR 
1234 1881,33  01  2008 
8762 2578  01  2008 
8726 2183,6475 01  2008 
2321 1745,8525 01  2008 
3123 1639,2  01  2008 
1934 2572  01  2008 

Daha büyük maaşı olan tüm yıllar boyunca aylar arasında seçim yapmak mümkün mü? Bu durumda Ocak 2008 8762.

cevap

1
SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY year_month 
          ORDER BY money DESC) AS rn 
    FROM (
    SELECT A.ssn, 
      SUM(B.WAGE)- SUM(B.SALARY/(8*20)) AS money, 
      TRUNC(rep_date, 'MM') AS year_month 
    FROM REP_LINES A 
      INNER JOIN COSTS B 
      ON ( A.JOB=B.CAT_NUM 
       and B.YEAR = EXTRACT(YEAR FROM A.REP_DATE)) 
    GROUP BY A.ssn, 
      TRUNC(rep_date, 'MM') 
) t 
) 
WHERE rn = 1; 
+0

t nedir.? Kullanamıyorum – LeonardBet

+0

@LeonardBet güncellendi – MT0

1

Sen keep kullanabilirsiniz oldu:

select year, month, max(salary) as salary, 
     max(ssn) over (dense_rank first order by salary desc) as max_ssn 
from (select to_char(l.rep_date, 'YYYY') as year, to_char(l.rep_date, 'MM') as month, 
      l.SSN, (SUM(c.WAGE)- SUM(c.SALARY/(8*20))) as salary 
     from rep_lines l join 
      costs c 
      on l.job = c.cat_num and 
       to_char(c.year) = to_char(l.rep_date, 'YYYY') 
    ) 
group by year, month 
order by year, month; 
0

Deneyebilirsin:

SELECT 
    MONTH 
    , YEAR 
    , FIRST_VALUE(SALARY) OVER (PARTITION BY MONTH,YEAR ORDER BY SALARY DESC) 
    , FIRST_VALUE(SSN) OVER (PARTITION BY MONTH,YEAR ORDER BY SALARY DESC) 
FROM your_table; 
İlgili konular