我需要让 我 部门中薪水最低的员工 使用反加入来做到。
select emp.employee_id,emp.last_name,emp.salary,emp.department_id
from employees emp
left join employees sml
on sml.department_id = emp.department_id and sml.salary < emp.salary
where sml.employee_id is null and emp.department_id is not null
但有人告诉我,可以通过 使用一次select的
window函数来做到这一点。但是我不能按department_id分组并同时使用它。那是虫子还是我愚蠢?
SELECT department_id,
min(salary) OVER (partition by department_id) as minsalary
FROM employees;
GROUP BY department_id
SQL Developer说00979。00000-“不是GROUP BY表达式”
如果您运行第二个查询而没有group by
(您可能已经尝试过)(从您发布的多余分号开始),您将看到每位员工得到一行,每行显示其所在部门的最低工资。该最小值是分析值,min()
因为它具有window子句。该PARTITION BY
是等效的GROUP BY
,但没有聚集在整个结果集。
获得相同结果的最简单方法(几乎)是使用RANK()
分析函数,该函数根据分配的分区和顺序对值进行排序,同时允许联系:
SELECT employee_id, last_name, salary, department_id,
RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rnk
FROM employees
ORDER BY department_id, rnk;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID RNK
----------- ------------------------- ---------- ------------- ----------
200 Whalen 4400 10 1
202 Fay 6000 20 1
201 Hartstein 13000 20 2
119 Colmenares 2500 30 1
118 Himuro 2600 30 2
117 Tobias 2800 30 3
116 Baida 2900 30 4
115 Khoo 3100 30 5
114 Raphaely 11000 30 6
...
102 De Haan 17000 90 1
101 Kochhar 17000 90 1
100 King 24000 90 3
...
对于部门20和30,您可以看到排名1的行是最低工资。对于部门90,有两名排名第一的员工,因为他们的最低工资相同。
您可以将其用作内联视图,并仅选择排名第一的行:
SELECT employee_id, last_name, salary, department_id
FROM (
SELECT employee_id, last_name, salary, department_id,
RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rnk
FROM employees
)
WHERE rnk = 1
ORDER BY department_id;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID
----------- ------------------------- ---------- -------------
200 Whalen 4400 10
202 Fay 6000 20
119 Colmenares 2500 30
203 Mavris 6500 40
132 Olson 2100 50
107 Lorentz 4200 60
204 Baer 10000 70
173 Kumar 6100 80
101 Kochhar 17000 90
102 De Haan 17000 90
113 Popp 6900 100
206 Gietz 8300 110
178 Grant 7000
13 rows selected.
如果您不必担心联系,那么还有一个更简单的选择,但这在这里不合适。
请注意,这比原始查询多了一行。您正在加入on sml.department_id =emp.department_id
。如果部门ID为null(如员工178那样),则该联接失败,因为您无法使用相等性测试将null与null进行比较。由于此解决方案没有联接,因此不适用,并且您会在结果中看到该员工。
我的典型用例是继续监控事件流以检测事件模式,但我希望窗口是跳转窗口。默认情况下,CEPSQL中的应该定义一个翻转窗口。是否可以为CEP模式匹配设置跳转窗口?或任何其他解决方案? 谢啦
如何在Flink SQL查询中使用SQL客户端进行窗口连接。窗口设置方式与下面链接中提到的方式相同https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/joining.html 需要窗口的示例查询:选择sourceKafka.*从sourceKafka内部连接SourceKafca上的bad
我分组和分区流如下: 有没有办法把这两者结合起来?我尝试将两者结合使用,并在PartionBy中使用groupingBy,但没有成功。有什么建议吗? 预期的结果是将这些人与以P开头的人分开,并按年龄分组。以下是人员名单:
问题内容: 我的要求: 确定的前10个帐户,并按帐号升序排列。 询问: 痕迹: 指数: 该说,在列。 强制扫描的费用从3855降低至11092 表中的总行数为632667; 以上都是测试区域的结果。生产实际上是数量的两倍。 我的数据库是Exadata,Quarter RAC。运行Oracle 11g R2。该数据库功能强大到可以立即执行,但是DBA不愿使用13M的tempSpc。商业报告该报告的频
下面是目前为止我所想到的伪代码。任何帮助都将不胜感激!谢谢! 我检查了Table API,但对于流,似乎不支持很多操作,例如OrderBy。
为了给出backfround,我使用