标签: analytic-functions

获取与Oracle中的最大和最小行有关的值

在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)

(如果有两个或更多员工的薪水最高或最低,我们希望始终按字母顺序返回第一个)。

一个一篇文章讨论了如何获取值只是最大但不能同时最大值和最小值。

基于上面的链接,我们目前有一个不整洁的解决方案,然后应用后续查询,但性能对我们很重要。我预测一个好的解决方案还需要解析函数,并且可能需要一个枢纽来将多行合并为单行。

任何帮助,不胜感激!理查德

sql oracle analytic-functions oracle11g

5
推荐指数
1
解决办法
2万
查看次数

从PARTITION BY子句中删除ORDER BY子句?

有没有办法可以减少下面内部查询的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是一个索引列,但这仍然像目前的资源一样浪费资源.(也许有一种方法可以将排序限制在单行的范围内?希望根本没有时间/精力用于分区内的排序)

sql oracle analytic-functions oracle10g oracle11g

5
推荐指数
2
解决办法
4053
查看次数

Oracle Analytic函数 - 重置窗口子句

我有以下数据集.

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)

sql oracle analytic-functions

5
推荐指数
1
解决办法
2304
查看次数

mysql:按ID分组,每个ID获得最高优先级

我有以下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)

mysql ranking analytic-functions rank

4
推荐指数
3
解决办法
3014
查看次数

Oracle Version 10 - 我们是否需要任何"特殊"来运行分析函数

我们将部署一些代码给使用Oracle版本10的客户端.我们的一些代码使用Oracle分析函数(特别是LAG).是否有任何特殊需要安装/允许permissiosn /等.使用分析函数正确执行的代码?

oracle analytic-functions oracle10g

4
推荐指数
1
解决办法
227
查看次数

在哪些情况下SQL Server ROW_NUMBER()不是从1开始?

我们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 …

sql t-sql sql-server analytic-functions

4
推荐指数
1
解决办法
3441
查看次数

在组的子组上应用COUNT函数

我编写了这个奇怪的例子,试图说明我想要做什么(这有点愚蠢,但请耐心等待):

请考虑下表:

雇员
员工表数据

结婚,认证宗教只是布尔字段(在Oracle的情况下,它们的类型为NUMBER(1,0)).

我需要为每个雇员提供显示的SQL,在以下薪资类别中显示已婚,认证和宗教雇员的数量:

  • 一个 SALARY > 2000
  • SALARY BETWEEN 1000 AND 2000
  • C SALARY < 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).

sql oracle group-by analytic-functions

4
推荐指数
1
解决办法
2843
查看次数

在每个分区的列中查找最大值

我有表结构,如:

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)

oracle max analytic-functions partition-by

4
推荐指数
1
解决办法
517
查看次数

如何在此查询中避免相同的时间?

我的桌子: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)

sql sql-server datetime analytic-functions window-functions

4
推荐指数
1
解决办法
83
查看次数

BigQuery 是否支持分析用户定义函数?

BigQuery 支持:

  1. SQL 和 JavaScript 中的用户定义函数(UDF)。
  2. 计算一组行的值并为每行返回一个结果的分析函数。这些函数可以与OVER子句一起使用。有一组预定义的分析函数。

问题#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)

analytic-functions google-bigquery bigquery-udf

3
推荐指数
1
解决办法
1060
查看次数