在Oracle 11g中,我们需要能够查询表以从特定组中具有最高和最低值的行中提取信息。例如,使用EMP表,我们想要找到每个部门中薪水最高的人的名字和薪水最低的人的名字
DEPTNO MAX_SAL MAX_EARNER MIN_SAL MIN_EARNER
-------------------------------------------------------
10 5000 KING 1300 MILLER
20 3000 FORD 2975 JONES
etc
Run Code Online (Sandbox Code Playgroud)
(如果有两个或更多员工的薪水最高或最低,我们希望始终按字母顺序返回第一个)。
一个一篇文章讨论了如何获取值只是最大但不能同时最大值和最小值。
基于上面的链接,我们目前有一个不整洁的解决方案,然后应用后续查询,但性能对我们很重要。我预测一个好的解决方案还需要解析函数,并且可能需要一个枢纽来将多行合并为单行。
任何帮助,不胜感激!理查德
有没有办法可以减少下面内部查询的OVER部分中'ORDER BY lro_pid'子句的影响?
SELECT *
FROM (SELECT a.*,
Row_Number() over (PARTITION BY search_point_type
ORDER BY lro_pid) spt_rank
FROM lro_search_point a
ORDER BY spt_rank)
WHERE spt_rank = 1;
Run Code Online (Sandbox Code Playgroud)
我不关心在分区中对此结果进行排序,因为我想完全按其他变量排序.lro_pid是一个索引列,但这仍然像目前的资源一样浪费资源.(也许有一种方法可以将排序限制在单行的范围内?希望根本没有时间/精力用于分区内的排序)
我有以下数据集.
create table t1 (
dept number,
date1 date
);
Table created.
insert into t1 values (100, '01-jan-2013');
insert into t1 values (100, '02-jan-2013');
insert into t1 values (200, '03-jan-2013');
insert into t1 values (100, '04-jan-2013');
commit;
Run Code Online (Sandbox Code Playgroud)
我的目标是创建一个排名列,每次更改部门时都会重置.我可以用于"partition by"子句的最接近的列是dept,但这不会给我想要的结果.
SQL> select * from t1;
DEPT DATE1
---------- ---------
100 01-JAN-13
100 02-JAN-13
200 03-JAN-13
100 04-JAN-13
select dept,
date1,
rank () Over (partition by dept order by date1) rnk
from t1
order by date1;
DEPT DATE1 RNK
---------- --------- ---------- …Run Code Online (Sandbox Code Playgroud) 我有以下mysql表名为"pics",包含以下字段和示例数据:
id vehicle_id filename priority
1 45 a.jpg 4
2 45 b.jpg 1
3 56 f.jpg 4
4 67 cc.jpg 4
5 45 kt.jpg 3
6 67 gg.jpg 1
Run Code Online (Sandbox Code Playgroud)
在单个查询中,是否可以为每个vehicle_id获取一行,并且该行是最高优先级?
我正在寻找的结果:
array (
[0] => array( [id] => '2', [vehicle_id] => '45', [filename] => 'b.jpg', [priority] => '1' ),
[1] => array( [id] => '3', [vehicle_id] => '56', [filename] => 'f.jpg', [priority] => '4' ),
[2] => array( [id] => '6', [vehicle_id] => '67', [filename] => 'gg.jpg', [priority] => '1' …Run Code Online (Sandbox Code Playgroud) 我们将部署一些代码给使用Oracle版本10的客户端.我们的一些代码使用Oracle分析函数(特别是LAG).是否有任何特殊需要安装/允许permissiosn /等.使用分析函数正确执行的代码?
我们ROW_NUMBER()在查询中使用.它几乎在所有情况下都会返回正确的结果.但是对于1个用户来说,它的表现非常不同.
With #TEST as (
select top 50
ROW_NUMBER() over (order by a.ID) as RN,
a.ID ID, a.Name Name
FROM a
where a.name like '%test%')
select *
from #TEST
where RN BETWEEN 1 AND 50
order by RN
Run Code Online (Sandbox Code Playgroud)
当页面大小设置为50时,此查询对该用户正常工作.但是当页面大小设置为100时,我们发现它没有返回所有行.它只返回10行.即使有超过100个结果满足条件.请找到以下无法正常工作的查询.
With #TEST as (
select top 100
ROW_NUMBER() over (order by a.ID) as RN,
a.ID ID, a.Name Name
FROM a
where a.name like '%test%')
select *
from #TEST
where RN BETWEEN 1 AND 100
order by RN
Run Code Online (Sandbox Code Playgroud)
当试图验证原因时,我们发现第二个查询返回的RN值大于100.它不是从1开始.
有人可以解释这种行为的可能原因.语法中是否有任何要修改的内容,或者在SQL …
我编写了这个奇怪的例子,试图说明我想要做什么(这有点愚蠢,但请耐心等待):
请考虑下表:
雇员
结婚,认证和宗教只是布尔字段(在Oracle的情况下,它们的类型为NUMBER(1,0)).
我需要为每个雇员提供显示的SQL,在以下薪资类别中显示已婚,认证和宗教雇员的数量:
SALARY > 2000SALARY BETWEEN 1000 AND 2000SALARY < 1000 基于以上数据集,这是我期望得到的:
到目前为止,我只提出了以下SQL:
SELECT
COUNT(CASE WHEN married = 1 THEN 1 END) as MARRIED,
COUNT(CASE WHEN certified = 1 THEN 1 END) as certified,
COUNT(CASE WHEN religious = 1 THEN 1 END) as religious,
hire_year
FROM employees
GROUP BY hire_year;
Run Code Online (Sandbox Code Playgroud)
执行此SQL的结果是:

这几乎是我所需要的,但我还需要根据工资范围将这些计数器进一步划分为组.
我想一些分析函数,根据一些SQL表达式将组划分为桶会有所帮助,但我无法弄清楚哪一个.我尝试使用NTILE,但它期望一个正常量作为参数,而不是SQL表达式(例如SALARY BETWEEN X and Y).
我有表结构,如:
CREATE TABLE new_test
( col1 NUMBER(2) NOT NULL,
col2 VARCHAR2(50) NOT NULL,
col3 VARCHAR2(50) NOT NULL,
col4 VARCHAR2(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
它有数据:
col1 col2 col3 col4
0 A B X
1 A B Y
2 A B Z
1 C D L
3 C D M
Run Code Online (Sandbox Code Playgroud)
我需要找到col4的值,它对col2和col3的组合具有最大值.例如我的结果应该是:
col4
Z
M
Run Code Online (Sandbox Code Playgroud)
我尝试使用oracle分析函数:
SELECT col4, MAX(col1) OVER (PARTITION BY col2, col3) FROM (
SELECT col2, col3, col4, col1
FROM new_test);
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作.你能帮我解决这个问题吗?
更新:我可以使用:
SELECT a.col4
FROM new_test a,
(SELECT col2,
col3,
col4, …Run Code Online (Sandbox Code Playgroud) 我的桌子:Trnevents
emp_reader_id EVENTID DT
102 0 2018-01-04 15:57:04.000
102 0 2018-01-04 15:58:05.000
102 1 2018-01-04 16:46:19.000
102 0 2018-01-04 18:15:27.000
102 1 2018-01-04 18:20:47.000
102 0 2018-01-04 20:02:05.000
102 0 2018-01-04 21:47:29.000
102 1 2018-01-04 22:00:00.000
Run Code Online (Sandbox Code Playgroud)
我使用这个查询它运作良好,但它得到相同的时间
select
emp_Reader_id, cast(DT as date) [date]
, DT as check_in_1
, next_timestamp as check_out_1
from (
select
emp_Reader_id, DT, EVENTID, next_timestamp, next_EVENTID
, dense_rank() over(partition by emp_Reader_id, cast(DT as date) order by DT) in_rank
from trnevents t1
outer apply (
select top(1) t2.DT, …Run Code Online (Sandbox Code Playgroud) BigQuery 支持:
问题#1:“BigQuery 是否支持分析用户定义函数?”
其背后的动机是我想实现Python pandas 代码中常见的拆分-应用-组合模式。这对于组内标准化和使用组统计数据的其他转换很有用。
我在Standart SQL中做了一个小测试:
create or replace function `mydataset.mylen`(arr array<string>) returns int64 as (
array_length(arr)
);
WITH Produce AS
(SELECT 'kale' as item, 23 as purchases, 'vegetable' as category
UNION ALL SELECT 'orange', 2, 'fruit'
UNION ALL SELECT 'cabbage', 9, 'vegetable'
UNION ALL SELECT 'apple', 8, 'fruit'
UNION ALL SELECT 'leek', 2, 'vegetable'
UNION ALL SELECT 'lettuce', 10, 'vegetable')
SELECT
item,
purchases,
category,
`mydataset.mylen`(item) …Run Code Online (Sandbox Code Playgroud) oracle ×6
sql ×6
oracle10g ×2
oracle11g ×2
sql-server ×2
bigquery-udf ×1
datetime ×1
group-by ×1
max ×1
mysql ×1
partition-by ×1
rank ×1
ranking ×1
t-sql ×1