标签: window-functions

SELECT 排名中的 SQL UPDATE 分区语句

我的问题是,我有一个这样的表:

Company, direction, type, year, month, value, rank
Run Code Online (Sandbox Code Playgroud)

当我创建表时,默认情况下排名为 0,我想要的是使用此选择更新表中的排名:

SELECT company, direction, type, year, month, value, rank() OVER (PARTITION BY direction, type, year, month ORDER BY value DESC) as rank
FROM table1
GROUP BY company, direction, type, year, month, value
ORDER BY company, direction, type, year, month, value;
Run Code Online (Sandbox Code Playgroud)

这个 Select 工作正常,但我找不到使用它来更新 table1 的方法

我还没有找到任何答案来用这种句子解决这样的问题。如果有人能给我任何关于是否可行的建议,我将非常感激。

谢谢!

sql oracle window-functions sql-update

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

如何在pyspark数据框中动态添加列

我正在尝试根据输入变量 vIssueCols 添加几列

from pyspark.sql import HiveContext
from pyspark.sql import functions as F
from pyspark.sql.window import Window
vIssueCols=['jobid','locid']
vQuery1 = 'vSrcData2= vSrcData'
vWindow1 = Window.partitionBy("vKey").orderBy("vOrderBy")
for x in vIssueCols:
Query1=vQuery1+'.withColumn("'+x+'_prev",F.lag(vSrcData.'+x+').over(vWindow1))'

exec(vQuery1)
Run Code Online (Sandbox Code Playgroud)

现在上面的查询将生成如下 vQuery1,并且它正在工作,但是

vSrcData2= vSrcData.withColumn("jobid_prev",F.lag(vSrcData.jobid).over(vWindow1)).withColumn("locid_prev",F.lag(vSrcData.locid).over(vWindow1))
Run Code Online (Sandbox Code Playgroud)

我不能写一个类似的查询吗

vSrcData2= vSrcData.withColumn(x+"_prev",F.lag(vSrcData.x).over(vWindow1))for x in vIssueCols
Run Code Online (Sandbox Code Playgroud)

并使用循环语句生成列。一些博客建议添加一个 udf 并调用它,但我将使用上面执行字符串方法来代替使用 udf。

window-functions pyspark

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

添加一个新列,指示 mysql 中的行号

我在 MySQL 中有一个表,例如:

hiredate
2020-02-03
2019-12-03
2018-08-07
Run Code Online (Sandbox Code Playgroud)

我想在它旁边添加一个新列并显示索引号:

hiredate     no
2020-02-03   1
2019-12-03   2
2018-08-07   3
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

mysql sql window-functions

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

在mysql 5.7中将rank()转换为(分区....)

我正在尝试在 mysql 5.7 中转换以下 sql

 SELECT T.STOREID AS STOREID,
           T.ARTID AS ARTID,
           T.TOTAMOUNT,
           MAX(T.HOUR) AS HOUR,
           RANK() OVER (PARTITION BY T.STOREID, T.ARTID
                        ORDER BY T.STOREID, T.ARTID, T.HOUR DESC) AS RN
    FROM T
ORDER BY T.STOREID,
         T.ARTID
Run Code Online (Sandbox Code Playgroud)

这在 oracle 中工作得很好,但在 mysql 中也能工作,因为只有 mysql 8 及更高版本支持此功能。任何人都可以帮助我,以便在 mysql 5.7 中获得相同的结果

mysql sql select subquery window-functions

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

如何获取mysql中每个用户的最新消息?

我有数据库来存储客户和消息

在此处输入图片说明

我正在尝试获取所有客户及其最新消息的列表,例如 Messenger 中的第一个屏幕。

SELECT *
FROM message AS m
LEFT JOIN customer AS c ON c.id=m.sender_id
ORDER BY m.sent_at DESC
Run Code Online (Sandbox Code Playgroud)

但这会返回所有用户的所有消息。我也试过这样做

SELECT * 
FROM message AS m
LEFT JOIN customer AS c ON c.id=m.sender_id
GROUP BY c.id
Run Code Online (Sandbox Code Playgroud)

但这不会在所有数据库上运行,并且无法对结果集进行排序以仅获取最新消息。

mysql sql datetime greatest-n-per-group window-functions

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

通过滚动窗口分区计算不同客户的数量

我的问题类似于redshift:在窗口分区上计算不同的客户,但我有一个滚动窗口分区。

我的查询看起来像这样,但不支持Redshift中的 COUNT 内的不同查询

select p_date, seconds_read, 
count(distinct customer_id) over (order by p_date rows between unbounded preceding and current row) as total_cumulative_customer
from table_x
Run Code Online (Sandbox Code Playgroud)

我的目标是计算截至每个日期的唯一客户总数(因此是滚动窗口)。

我尝试使用dense_rank()方法,但它会失败,因为我不能使用这样的窗口函数

select p_date, max(total_cumulative_customer) over ()
(select p_date, seconds_read, 
dense_rank() over (order by customer_id rows between unbounded preceding and current row) as total_cumulative_customer -- WILL FAIL HERE
from table_x
Run Code Online (Sandbox Code Playgroud)

任何解决方法或不同的方法都会有所帮助!

编辑:

输入数据样本

+------+----------+--------------+
| Cust |  p_date  | seconds_read |
+------+----------+--------------+
|    1 | 1-Jan-20 |           10 |
|    2 …
Run Code Online (Sandbox Code Playgroud)

sql count distinct window-functions amazon-redshift

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

PySpark 数据框的每日预测

我在 PySpark 中有以下数据框:

DT_BORD_REF:该月的日期列
REF_DATE: 过去和未来的当前日期参考
PROD_ID: 产品 ID
COMPANY_CODE: 公司 ID
CUSTOMER_CODE: 客户 ID
MTD_WD: 本月至今的工作日计数(日期 = DT_BORD_REF)
QUANTITY: 已售
QTE_MTD商品数 : 本月至本月的商品数日期

+-------------------+-------------------+-----------------+------------+-------------+-------------+------+--------+-------+
|        DT_BORD_REF|           REF_DATE|          PROD_ID|COMPANY_CODE|CUSTOMER_CODE|COUNTRY_ALPHA|MTD_WD|QUANTITY|QTE_MTD|
+-------------------+-------------------+-----------------+------------+-------------+-------------+------+--------+-------+
|2020-11-02 00:00:00|2020-11-04 00:00:00|          0000043|         503|     KDAI3982|          RUS|     1|     4.0|    4.0|
|2020-11-05 00:00:00|2020-11-04 00:00:00|          0000043|         503|     KDAI3982|          RUS|     3|    null|    4.0|
|2020-11-06 00:00:00|2020-11-04 00:00:00|          0000043|         503|     KDAI3982|          RUS|     4|    null|    4.0|
|2020-11-09 00:00:00|2020-11-04 00:00:00|          0000043|         503|     KDAI3982|          RUS|     5|    null|    4.0|
|2020-11-10 00:00:00|2020-11-04 …
Run Code Online (Sandbox Code Playgroud)

sql window-functions apache-spark apache-spark-sql pyspark

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

Postgresql 中的时间窗口滚动总和

我想知道是否可以在 Postgresql 中使用基于时间的窗口查询。

\n

原始数据位于前三列(日期、销售员、金额):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
日期推销员数量3 滚动天数总和
2020-01-01约翰1010
2020-01-02约翰1525
2020-01-03约翰833
2020-01-04约翰1235
2020-01-05约翰1131
2020-01-01丹尼尔55
2020-01-02丹尼尔611
2020-01-03丹尼尔718
2020-01-04丹尼尔821
2020-01-05丹尼尔924
\n
\n

第四列表示该销售员在过去三个滚动日内的总金额。

\n

Pandas 有内置函数可以做到这一点,但我想不出任何方法可以使用内置sum() over ()语法在 Postgresql 中做到这一点。我能够做到的唯一方法是使用横向连接和子查询的复杂组合以及时间增量比较的条件,至少可以说这是不优雅的。

\n

Pandas\' 方式(根据记忆,确切的语法可能略有不同) \xe2\x80\x94 无法获得任何简洁的信息:

\n
df.groupby(\'salesman\').rolling(\'3d\').sum()\n
Run Code Online (Sandbox Code Playgroud)\n

postgresql time-series window-functions rolling-computation

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

合并前一个记录之后的日期有零天或一天间隔的日期

我想在开始日期跟随结束日期或开始日期等于 SQL Server 中基于 ID 的结束日期时将多个记录合并为单个记录,同时在该组中获取 MAX(ID2)

以下是示例输入和输出。还添加了输入表的 SQL 代码:

create table #T (ID1 INT, ID2 INT, StartDate DATE, EndDate DATE)

insert into #T values
(100, 764286, '2019-05-01', '2019-05-31'),
(100, 764287, '2019-06-01', '2019-06-30'),
(100, 764288, '2019-07-10', '2019-07-31'),
(101, 764289, '2020-02-01', '2020-02-29'),
(101, 764290, '2020-02-29', '2020-03-31'),
(102, 764291, '2021-10-01', '2021-10-31'),
(102, 764292, '2021-11-01', '2021-11-30'),
(102, 764293, '2021-11-30', '2021-12-31'),
(103, 764294, '2022-01-01', '2022-01-31');
Run Code Online (Sandbox Code Playgroud)

示例输入和输出

这是我尝试过的脚本,但它没有给出我期望的 ID 100 的结果,它不应该合并与 ID 100 相关的所有记录

select m.ID1,
       NewID2  AS ID2,
       m.StartDate,
       lead(dateadd(day, -1, StartDate), 1, MaxEndDate) over …
Run Code Online (Sandbox Code Playgroud)

sql database sql-server window-functions gaps-and-islands

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

SQL 窗口函数 - NTH_VALUE - 如果我们对前 n-1 行使用 Order by,为什么会返回 NULL

在此输入图像描述

所以,我说的是 SQL 中的 NTH_VALUE(column,n)

现在我观察到,如果我使用 order by 子句并指定与 nth_value 内部相同的列,则所选列中的前 n-1 行始终为 NULL。这是为什么?如果我想选择第三列,并且第三列存在,那么无论我是否使用 order by(同一列)子句,它都应该返回行号 1 和行号 2 的第三列?另外,有什么办法可以解决它吗?

mysql window-functions

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