【问题标题】:Retrieve rows with highest salary per month检索每月薪水最高的行
【发布时间】:2016-07-24 12:31:36
【问题描述】:

我需要这样做,但我不知道。我有这张桌子。

USER | SALARY  |   DATE
1234   1881,33     01/01/08
8762   2578        01/01/08
8726   2183,6475   01/01/08
2321   1745,8525   01/01/08
3123   1639,2      01/01/08
1934   2572        01/01/08

是否可以从所有年份的月份中选择薪水较高的人?在这种情况下,2008 年 1 月是 8762。

【问题讨论】:

  • 专业提示:normalization
  • 你的“薪水”栏目是什么?这看起来不像货币价值......
  • @lad2025 我相信在这种情况下逗号是小数点分隔符,不用于表示值列表。
  • @aquinas 他们在法国做的 :)
  • 是的,是货币价值

标签: sql oracle oracle11g


【解决方案1】:

这可以使用窗口函数ROW_NUMBER 来实现。

它用于枚举按薪水降序排列的不同组中的行(在您的情况下为月份-解释如下)(在您的情况下,最高薪水将被分配一个rownum = 1):

SELECT 
 to_char(date_column, 'YYYY-MM'), 
 user
FROM (
 SELECT
 *,
 row_number() OVER (PARTITION BY to_char(date_column, 'YYYY-MM') ORDER BY salary DESC) AS rownum
FROM yourtable
 ) foo
WHERE rownum = 1
ORDER BY 1 -- not needed, looks nice in the results

使用TO_CHAR 函数从您的日期中仅获取年份和月份部分并获取组:

TO_CHAR(date_column, 'YYYY-MM')

【讨论】:

  • SQL Developer说这里有错误:extract(year_month from date_column) I think didn't exist year_month
  • 你说要这样做吗? SELECT to_char(FECHA, 'YYYY-MM'), SSN FROM(SELECT *,ROW_NUMBER() OVER (PARTITION BY to_char(FECHA, 'YYYY-MM') ORDER BY CUENTA DESC) AS ROWNUM FROM (SELECT A.SSN, (SUM(B.WAGE)- SUM(B.SALARY/(8*20))) CUENTA,trunc(REP_date,'mm') FECHA FROM REP_LINES A INNER JOIN COSTS B ON A.JOB=B.CAT_NUM and TO_CHAR(B.YEAR) = TO_CHAR(A.REP_DATE,'YYYY') GROUP BY A.SSN,trunc(REP_date,'mm') ORDER BY FECHA)) FOO WHERE ROWNUM = 1 ORDER BY 1;该表已更改为查询
  • SSN 是用户,FECHA 是日期
  • @ConsiderMe - 是的,您链接了 Oracle 文档...用于 MySQL,而不是用于 Oracle 数据库(OP 使用的 DBMS)。 Oracle 数据库中没有数据提取 (year_month)。
  • @mathguy 我已经纠正了,那是我的错误。我已经适当地改变了我的答案。
【解决方案2】:

我认为你可以使用 in 子句进行分组选择

select user from my_table 
where (salary, to_char(date,'mm-yyyy')) in 
   select(max(salary), to_char(date,'mm-yyyy') month_year 
        from my_table group by month_year);

【讨论】:

  • 我是个小菜鸟,你用 2011-01-17' 做什么?
  • 这有点奇怪 - 您会找到至少一个月内月薪最高的所有用户,但您没有显示每个月的获胜者。也许这就是OP想要的,但这似乎很奇怪。 (不确定 OP 想要什么,他的要求也可能被解释为找到所有月月薪最高的用户,而不是逐月。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2013-05-14
  • 2018-08-24
  • 2019-05-04
相关资源
最近更新 更多