我的问题是,我有一个这样的表:
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 的方法
我还没有找到任何答案来用这种句子解决这样的问题。如果有人能给我任何关于是否可行的建议,我将非常感激。
谢谢!
我正在尝试根据输入变量 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。
我在 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 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 中获得相同的结果
我有数据库来存储客户和消息
我正在尝试获取所有客户及其最新消息的列表,例如 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)
但这不会在所有数据库上运行,并且无法对结果集进行排序以仅获取最新消息。
我的问题类似于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) 我在 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) 我想知道是否可以在 Postgresql 中使用基于时间的窗口查询。
\n原始数据位于前三列(日期、销售员、金额):
\n| 日期 | 推销员 | 数量 | 3 滚动天数总和 |
|---|---|---|---|
| 2020-01-01 | 约翰 | 10 | 10 |
| 2020-01-02 | 约翰 | 15 | 25 |
| 2020-01-03 | 约翰 | 8 | 33 |
| 2020-01-04 | 约翰 | 12 | 35 |
| 2020-01-05 | 约翰 | 11 | 31 |
| 2020-01-01 | 丹尼尔 | 5 | 5 |
| 2020-01-02 | 丹尼尔 | 6 | 11 |
| 2020-01-03 | 丹尼尔 | 7 | 18 |
| 2020-01-04 | 丹尼尔 | 8 | 21 |
| 2020-01-05 | 丹尼尔 | 9 | 24 |
第四列表示该销售员在过去三个滚动日内的总金额。
\nPandas 有内置函数可以做到这一点,但我想不出任何方法可以使用内置sum() over ()语法在 Postgresql 中做到这一点。我能够做到的唯一方法是使用横向连接和子查询的复杂组合以及时间增量比较的条件,至少可以说这是不优雅的。
Pandas\' 方式(根据记忆,确切的语法可能略有不同) \xe2\x80\x94 无法获得任何简洁的信息:
\ndf.groupby(\'salesman\').rolling(\'3d\').sum()\nRun Code Online (Sandbox Code Playgroud)\n 我想在开始日期跟随结束日期或开始日期等于 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 中的 NTH_VALUE(column,n)
现在我观察到,如果我使用 order by 子句并指定与 nth_value 内部相同的列,则所选列中的前 n-1 行始终为 NULL。这是为什么?如果我想选择第三列,并且第三列存在,那么无论我是否使用 order by(同一列)子句,它都应该返回行号 1 和行号 2 的第三列?另外,有什么办法可以解决它吗?
window-functions ×10
sql ×7
mysql ×4
pyspark ×2
apache-spark ×1
count ×1
database ×1
datetime ×1
distinct ×1
oracle ×1
postgresql ×1
select ×1
sql-server ×1
sql-update ×1
subquery ×1
time-series ×1