标签: window-functions

SQL Server:PARTITION BY和GROUP BY之间的区别

多年来GROUP BY,我一直在使用所有类型的聚合查询.最近,我一直在反向设计一些PARTITION BY用于执行聚合的代码.在阅读我能找到的所有文档时PARTITION BY,听起来很像GROUP BY,可能还添加了一些额外的功能?它们是相同通用功能的两个版本,还是它们完全不同?

t-sql sql-server aggregate-functions window-functions

338
推荐指数
8
解决办法
59万
查看次数

Oracle"Partition By"关键字

有人可以解释partition by关键字的作用并给出一个简单的例子,以及为什么人们会想要使用它?我有一个由其他人编写的SQL查询,我正在试图找出它的作用.

分区示例:

SELECT empno, deptno, COUNT(*) 
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Run Code Online (Sandbox Code Playgroud)

我在网上看到的例子似乎有点过于深入.

sql oracle window-functions

242
推荐指数
4
解决办法
42万
查看次数

熊猫在每组中获得最高n条记录

假设我有像这样的pandas DataFrame:

>>> df = pd.DataFrame({'id':[1,1,1,2,2,2,2,3,4],'value':[1,2,3,1,2,3,4,1,1]})
>>> df
   id  value
0   1      1
1   1      2
2   1      3
3   2      1
4   2      2
5   2      3
6   2      4
7   3      1
8   4      1
Run Code Online (Sandbox Code Playgroud)

我想为每个id获取一个包含前2条记录的新DataFrame,如下所示:

   id  value
0   1      1
1   1      2
3   2      1
4   2      2
7   3      1
8   4      1
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式在组内编号记录:

>>> dfN = df.groupby('id').apply(lambda x:x['value'].reset_index()).reset_index()
>>> dfN
   id  level_1  index  value
0   1        0      0      1
1   1        1      1      2 …
Run Code Online (Sandbox Code Playgroud)

python top-n greatest-n-per-group window-functions pandas

138
推荐指数
6
解决办法
12万
查看次数

oracle中RANK()和DENSE_RANK()函数之间有什么区别?

RANK()DENSE_RANK()功能有什么区别?如何找到下emptbl表中的第n个薪水?

DEPTNO  EMPNAME    SAL
------------------------------
10       rrr    10000.00
11       nnn    20000.00
11       mmm    5000.00
12       kkk    30000.00
10       fff    40000.00
10       ddd    40000.00
10       bbb    50000.00
10       ccc    50000.00
Run Code Online (Sandbox Code Playgroud)

如果在表数据中有nulls,如果我想找nth工资会怎么样?

sql oracle window-functions

137
推荐指数
5
解决办法
46万
查看次数

在postgres中选择行号

如何在postgres中选择行号.

我试过这个:

select
    row_number() over (ORDER BY cgcode_odc_mapping_id)as rownum,
    cgcode_odc_mapping_id
  from access_odc.access_odc_mapping_tb
  order by cgcode_odc_mapping_id
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

ERROR: syntax error at or near "over"
LINE 1: select row_number() over (ORDER BY cgcode_odc_mapping_id)as

我检查过这些页面:如何在PostgreSQL查询中显示行号?


这是我的查询:

 select row_number() over (ORDER BY cgcode_odc_mapping_id)as rownum,cgcode_odc_mapping_id from access_odc.access_odc_mapping_tb order by cgcode_odc_mapping_id 
Run Code Online (Sandbox Code Playgroud)

这是错误:

错误:语法错误在"超过"LINE 1处或附近:选择row_number()over(ORDER BY cgcode_odc_mapping_id)as

sql postgresql window-functions

96
推荐指数
1
解决办法
16万
查看次数

带有元素编号的PostgreSQL unnest()

当我有一个具有分隔值的列时,我可以使用该unnest()函数:

myTable
id | elements
---+------------
1  |ab,cd,efg,hi
2  |jk,lm,no,pq
3  |rstuv,wxyz

select id, unnest(string_to_array(elements, ',')) AS elem
from myTable

id | elem
---+-----
1  | ab
1  | cd
1  | efg
1  | hi
2  | jk
...
Run Code Online (Sandbox Code Playgroud)

我如何包含元素编号?即:

id | elem | nr
---+------+---
1  | ab   | 1
1  | cd   | 2
1  | efg  | 3
1  | hi   | 4
2  | jk   | 1
...
Run Code Online (Sandbox Code Playgroud)

我想要源字符串中每个元素的原始位置.我试着窗口函数(row_number(), …

sql arrays postgresql window-functions set-returning-functions

69
推荐指数
3
解决办法
8万
查看次数

67
推荐指数
3
解决办法
13万
查看次数

计算PostgreSQL中的累积和

我想找到累积或运行的字段数量,并将其从分段插入表格.我的暂存结构是这样的:

ea_month    id       amount    ea_year    circle_id
April       92570    1000      2014        1
April       92571    3000      2014        2
April       92572    2000      2014        3
March       92573    3000      2014        1
March       92574    2500      2014        2
March       92575    3750      2014        3
February    92576    2000      2014        1
February    92577    2500      2014        2
February    92578    1450      2014        3          
Run Code Online (Sandbox Code Playgroud)

我希望我的目标表看起来像这样:

ea_month    id       amount    ea_year    circle_id    cum_amt
February    92576    1000      2014        1           1000 
March       92573    3000      2014        1           4000
April       92570    2000      2014        1           6000
February    92577    3000      2014 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql analytic-functions cumulative-sum window-functions

62
推荐指数
1
解决办法
6万
查看次数

在应用LIMIT之前获得结果计数的最佳方法

分页来自数据库的数据时,您需要知道将有多少页面呈现页面跳转控件.

目前我通过运行查询两次,一次包装count()以确定总结果,第二次应用限制以获取当前页面所需的结果.

这似乎效率低下.有没有更好的方法来确定在LIMIT应用之前会返回多少结果?

我正在使用PHP和Postgres.

php sql postgresql window-functions sql-limit

58
推荐指数
2
解决办法
3万
查看次数

为什么在where子句中没有窗口函数?

标题说明了这一点,为什么我不能在SQL Server的where子句中使用窗口函数?

这个查询很有意义:

select id, sales_person_id, product_type, product_id, sale_amount
from Sales_Log
where 1 = row_number() over(partition by sales_person_id, product_type, product_id order by sale_amount desc)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.有没有比CTE /子查询更好的方法?

编辑

值得一提的是CTE的查询:

with Best_Sales as (
    select id, sales_person_id, product_type, product_id, sale_amount, row_number() over (partition by sales_person_id, product_type, product_id order by sales_amount desc) rank
    from Sales_log
)
select id, sales_person_id, product_type, product_id, sale_amount
from Best_Sales
where rank = 1
Run Code Online (Sandbox Code Playgroud)

编辑

用子查询显示答案的+1,但实际上我正在寻找无法在where子句中使用窗口函数的原因.

sql t-sql sql-server window-functions

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