在对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)
如果有人有任何建议,请告诉我.
我正在尝试创建一个包含行号的视图,如下所示:
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) 我有一张这样的桌子
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)
但是,我不知道这是否是一个很好的解决方案,因为我需要引入行号,这有点麻烦.
你有更好的吗?
我有一个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)
关于如何解决这个问题的任何想法?
示例数据: …
sql postgresql aggregate-functions date-arithmetic window-functions
假设我们有一张桌子:
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) 虽然一对夫妇的问题在已经发布的SO约之间的区别Over Partition By和Group By,我没有找到一个明确的结论,关于执行更好.
我在SqlFiddle上设置了一个简单的场景,其中Over (Partition By)似乎有一个更好的执行计划(但我并不熟悉它们).
表中的数据量是否应该改变这个?难道Over (Partition By)那么最终执行得更好?
使用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
使用Spark SQL的窗口函数,我需要按多列分区来运行我的数据查询,如下所示:
val w = Window.partitionBy($"a").partitionBy($"b").rangeBetween(-100, 0)
我目前没有测试环境(正在进行设置),但作为一个简单的问题,这是当前支持作为Spark SQL的窗口函数的一部分,还是这不起作用?
样本数据
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和 …
我正在尝试在带有月度数据的 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) window-functions ×10
sql ×7
postgresql ×6
group-by ×2
apache-spark ×1
mysql ×1
pandas ×1
python ×1
random ×1
rank ×1
sql-server ×1
sql-view ×1
view ×1