标签: window-functions

在MySQL中对结果进行排名时如何处理关系?

在对mysql查询进行排名时如何处理关系?我在这个例子中简化了表名和列,但它应该说明我的问题:

SET @rank=0;

   SELECT student_names.students, 
          @rank := @rank +1 AS rank, 
          scores.grades
     FROM student_names  
LEFT JOIN scores ON student_names.students = scores.students
 ORDER BY scores.grades DESC
Run Code Online (Sandbox Code Playgroud)

所以想象一下上面的查询产生:

Students  Rank  Grades
=======================
Al         1     90
Amy        2     90
George     3     78
Bob        4     73
Mary       5     NULL
William    6     NULL
Run Code Online (Sandbox Code Playgroud)

虽然Al和Amy的成绩相同,但其中一个排名高于另一个.艾米被扯掉了.我怎样才能让艾米和艾尔拥有相同的排名,这样他们的排名都是1.另外,威廉和玛丽没有参加考试.他们上课并在男孩的房间里吸烟.他们应该并列最后一个位置.

正确的排名应该是:

Students  Rank  Grades
========================
Al         1     90
Amy        1     90
George     2     78
Bob        3     73
Mary       4     NULL
William    4     NULL
Run Code Online (Sandbox Code Playgroud)

如果有人有任何建议,请告诉我.

mysql sql rank window-functions

7
推荐指数
1
解决办法
2865
查看次数

使用分组为视图生成id行

我正在尝试创建一个包含行号的视图,如下所示:

create or replace view daily_transactions as
select 
    generate_series(1, count(t)) as id,        
    t.ic,
    t.bio_id,
    t.wp,    
    date_trunc('day', t.transaction_time)::date transaction_date, 
    min(t.transaction_time)::time time_in, 
    w.start_time wp_start,    
    w.start_time - min(t.transaction_time)::time in_diff,    
    max(t.transaction_time)::time time_out,     
    w.end_time wp_end,    
    max(t.transaction_time)::time - w.end_time out_diff,     
    count(t) total_transactions,
    calc_att_status(date_trunc('day', t.transaction_time)::date,
                    min(t.transaction_time)::time,
                    max(t.transaction_time)::time,
                    w.start_time, w.end_time ) status        
from transactions t
left join wp w  on (t.wp = w.wp_name)
group by ic, bio_id, t.wp, date_trunc('day', transaction_time),
         w.start_time, w.end_time;
Run Code Online (Sandbox Code Playgroud)

我最终得到了重复的行.SELECT DISTINCT也不起作用.有任何想法吗?

交易表:

create table transactions(
    id serial primary key,    
    ic text references users(ic), …
Run Code Online (Sandbox Code Playgroud)

sql postgresql view sql-view window-functions

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

为每个组选择随机行

我有一张这样的桌子

ID    ATTRIBUTE
 1    A
 1    A
 1    B
 1    C
 2    B
 2    C
 2    C
 3    A
 3    B
 3    C
Run Code Online (Sandbox Code Playgroud)

我想为每个ID 选择一个随机属性.结果因此看起来像这样(虽然这只是众多选择之一

ATTRIBUTE
B
C
C
Run Code Online (Sandbox Code Playgroud)

这是我对这个问题的尝试

SELECT
  "ATTRIBUTE"
FROM
  (
  SELECT
    "ID",
    "ATTRIBUTE",
    row_number() OVER (PARTITION BY "ID" ORDER BY random()) rownum
  FROM
    table
  ) shuffled
WHERE
  rownum = 1
Run Code Online (Sandbox Code Playgroud)

但是,我不知道这是否是一个很好的解决方案,因为我需要引入行号,这有点麻烦.

你有更好的吗?

sql random postgresql group-by window-functions

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

在SQL中跨时间轴汇总值

问题

我有一个PostgreSQL数据库,我试图总结一下收银机的收入.收银机可以具有状态ACTIVE或INACTIVE,但我只想总结在给定时间段内处于ACTIVE状态时创建的收益.

我有两张桌子; 一个标志着收入,另一个标志着收银机状态:

CREATE TABLE counters
(
  id bigserial NOT NULL,
  "timestamp" timestamp with time zone,
  total_revenue bigint,
  id_of_machine character varying(50),
  CONSTRAINT counters_pkey PRIMARY KEY (id)
)

CREATE TABLE machine_lifecycle_events
(
  id bigserial NOT NULL,
  event_type character varying(50),
  "timestamp" timestamp with time zone,
  id_of_affected_machine character varying(50),
  CONSTRAINT machine_lifecycle_events_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

每1分钟添加一个计数器条目,而total_revenue仅增加.每次机器状态发生变化时,都会添加machine_lifecycle_events条目.

我添加了一个说明问题的图像.应该总结蓝色时期的收入.

时间线显示问题.

到目前为止我尝试过的

我创建了一个查询,它可以在给定的瞬间为我提供总收入:

SELECT total_revenue 
  FROM counters 
 WHERE timestamp < '2014-03-05 11:00:00' 
       AND id_of_machine='1' 
ORDER BY 
       timestamp desc 
 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

问题

  1. 如何计算两个时间戳之间的收入?
  2. 当我必须将machine_lifecycle_events中的时间戳与输入周期进行比较时,如何确定蓝色时段的开始和结束时间戳?

关于如何解决这个问题的任何想法?

更新

示例数据: …

sql postgresql aggregate-functions date-arithmetic window-functions

7
推荐指数
1
解决办法
994
查看次数

PostgreSQL - 列值已更改 - 选择查询优化

假设我们有一张桌子:

CREATE TABLE p
(
   id serial NOT NULL, 
   val boolean NOT NULL, 
   PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

填充了一些行:

insert into p (val)
values (true),(false),(false),(true),(true),(true),(false);
Run Code Online (Sandbox Code Playgroud)
ID  VAL
1   1
2   0
3   0
4   1
5   1
6   1
7   0

我想确定何时更改了值.所以我的查询结果应该是:

ID  VAL
2   0
4   1
7   0

我有一个连接和子查询的解决方案:

select min(id) id, val from
(
  select p1.id, p1.val, max(p2.id) last_prev
  from p p1
  join p p2
    on p2.id < p1.id and p2.val != p1.val
  group by p1.id, p1.val
) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql window-functions gaps-and-islands

7
推荐指数
2
解决办法
2660
查看次数

过分区By和Group By的SQL Server性能比较

虽然一对夫妇的问题在已经发布的SO约之间的区别Over Partition ByGroup By,我没有找到一个明确的结论,关于执行更好.

在SqlFiddle上设置了一个简单的场景,其中Over (Partition By)似乎有一个更好的执行计划(但我并不熟悉它们).

表中的数据量是否应该改变这个?难道Over (Partition By)那么最终执行得更好?

在此输入图像描述

在此输入图像描述

sql-server group-by sql-server-performance window-functions

7
推荐指数
1
解决办法
5267
查看次数

Postgres窗口(确定连续的天数)

使用Postgres 9.3,我试图计算某种天气类型的连续天数.如果我们假设我们有定期的时间序列和天气预报:

date|weather
"2016-02-01";"Sunny"
"2016-02-02";"Cloudy"
"2016-02-03";"Snow"
"2016-02-04";"Snow"
"2016-02-05";"Cloudy"
"2016-02-06";"Sunny"
"2016-02-07";"Sunny"
"2016-02-08";"Sunny"
"2016-02-09";"Snow"
"2016-02-10";"Snow"
Run Code Online (Sandbox Code Playgroud)

我想要的东西算在同一天气的连续日子里.结果应如下所示:

date|weather|contiguous_days 
"2016-02-01";"Sunny";1
"2016-02-02";"Cloudy";1
"2016-02-03";"Snow";1
"2016-02-04";"Snow";2
"2016-02-05";"Cloudy";1
"2016-02-06";"Sunny";1
"2016-02-07";"Sunny";2
"2016-02-08";"Sunny";3
"2016-02-09";"Snow";1
"2016-02-10";"Snow";2
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用窗口函数.起初,它似乎应该是明智的,但后来我发现它比预期的要困难得多.

这是我试过的......

Select date, weather, Row_Number() Over (partition by weather order by date)
  from t_weather
Run Code Online (Sandbox Code Playgroud)

将当前行与下一行进行比较会更容易吗?在保持计数的同时,你会怎么做?任何想法,想法,甚至解决方案都会有所帮助!-Kip

sql postgresql window-functions gaps-and-islands

7
推荐指数
1
解决办法
561
查看次数

在Spark SQL中按多列进行分区

使用Spark SQL的窗口函数,我需要按多列分区来运行我的数据查询,如下所示:

val w = Window.partitionBy($"a").partitionBy($"b").rangeBetween(-100, 0)

我目前没有测试环境(正在进行设置),但作为一个简单的问题,这是当前支持作为Spark SQL的窗口函数的一部分,还是这不起作用?

window-functions apache-spark apache-spark-sql

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

窗口函数:last_value(ORDER BY ... ASC)与last_value(ORDER BY ... DESC)相同

样本数据

CREATE TABLE test
    (id integer, session_ID integer, value integer)
;

INSERT INTO test
    (id, session_ID, value)
VALUES
    (0, 2, 100),
    (1, 2, 120),
    (2, 2, 140),
    (3, 1, 900),
    (4, 1, 800),
    (5, 1, 500)
;
Run Code Online (Sandbox Code Playgroud)

当前查询

select 
id,
last_value(value) over (partition by session_ID order by id) as last_value_window,
last_value(value) over (partition by session_ID order by id desc) as last_value_window_desc
from test
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

我在使用last_value()窗口函数时遇到问题:http : //sqlfiddle.com/#!15/bcec0/2

在小提琴中,我尝试使用last_value()查询中的排序方向。

编辑: 问题不在于:为什么我没有得到所有时间的最后一个值,以及如何使用frame子句(unbounded preceding和 …

sql postgresql window-functions

7
推荐指数
2
解决办法
2733
查看次数

具有每月偏移量的熊猫滚动()函数

我正在尝试在带有月度数据的 Pandas 数据框上使用滚动()函数。但是,我删除了一些 NaN 值,所以现在我的时间序列中有一些差距。因此,基本窗口参数给出了一个误导性的答案,因为它只是查看之前的观察结果:

import pandas as pd
import numpy as np
import random
dft = pd.DataFrame(np.random.randint(0,10,size=len(dt)),index=dt)
dft.columns = ['value']
dft['value'] = np.where(dft['value'] < 3,np.nan,dft['value'])
dft = dft.dropna()
dft['basic'] = dft['value'].rolling(2).sum()
Run Code Online (Sandbox Code Playgroud)

例如,参见 2017-08-31 条目,其总和为 3.0 和 9.0,但上一个条目是 2017-03-31。

In [57]: dft.tail()
Out[57]:
            value  basic
2017-02-28    8.0   12.0
2017-03-31    3.0   11.0
2017-08-31    9.0   12.0
2017-10-31    7.0   16.0
2017-11-30    7.0   14.0
Run Code Online (Sandbox Code Playgroud)

自然的解决方案(我认为)是使用“2M”偏移量,但它给出了一个错误:

In [58]: dft['basic2M'] = dft['value'].rolling('2M').sum()
...<output omitted>...
ValueError: <2 * MonthEnds> is a non-fixed frequency
Run Code Online (Sandbox Code Playgroud)

如果我移动每日偏移量,我可以让它工作,但这似乎是一个奇怪的解决方法:

In [59]: dft['basic32D'] …
Run Code Online (Sandbox Code Playgroud)

python window-functions pandas rolling-computation

7
推荐指数
1
解决办法
2221
查看次数