我有一个用作array_agg窗口函数的查询,即带有over (...)子句。我只想获取此数组聚合中的一组不同值,但这在 Postgres 9.4 中并未实现:
对于以下(简化的)查询,
with test_data(day, daytime, song) as (
select 'MON', 'morning', 'A'
union all
select 'MON', 'morning', 'B'
union all
select 'MON', 'afternoon', 'A'
union all
select 'TUE', 'afternoon', 'B'
)
select distinct
day,
first_value(daytime) over w as started,
array_agg(distinct daytime) over w as daytimes,
array_agg(distinct song) over w as songs
from test_data
window w as (partition by day order by daytime ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
Run Code Online (Sandbox Code Playgroud)
Postgres 返回以下内容:
SQLERROR …Run Code Online (Sandbox Code Playgroud) 我想使用select *在 HSQLDB 数据库上触发/sf/answers/266040071/中建议的查询,例如
WITH tmpTable AS (
SELECT p.* ,
ROW_NUMBER() OVER(PARTITION BY p.groupColumn order by p.groupColumn desc) AS rowCount
FROM sourceTable p) SELECT * FROM tmpTable WHERE tmpTable.rowCount = 1
Run Code Online (Sandbox Code Playgroud)
但出现以下错误:
Caused by: org.hsqldb.HsqlException: unexpected token: PARTITION required: )
Run Code Online (Sandbox Code Playgroud)
意味着不支持PARTITION BY 。
我对 HSQLDB 的特定查询有解决方法吗?
是否可以引用窗口分区中的当前行?我想做如下的事情:
SELECT min(ABS(variable - CURRENT.variable)) over (order by criterion RANGE UNBOUNDED PRECEDING)
也就是说,我想在给定的分区中找到最接近当前值的变量。可以做这样的事情吗?
举个例子,来自:
criterion | variable
1 2
2 4
3 2
4 7
5 6
我们将得到:
null
2
0
3
1
谢谢
我有一个具有三列 time、col1、col2 的流数据帧。我必须在第 2 列上应用滞后函数。我尝试过以下查询。
val w = org.apache.spark.sql.expressions.Window.oderBy("time")
df.select(col("time"),col("col1"),lag("col3",1).over(w))
Run Code Online (Sandbox Code Playgroud)
但它给出了以下异常
org.apache.spark.sql.AnalysisException: Non-time-based windows are not supported on streaming DataFrames/Datasets
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
提前致谢。
scala window-functions apache-spark apache-spark-sql spark-structured-streaming
我正在尝试利用 MAX() OVER PARTITION BY 函数来评估我公司购买的特定部件的最新收据。下面是去年一些零件的信息示例表:
| VEND_NUM | VEND_NAME | RECEIPT_NUM | RECEIPT_ITEM | RECEIPT_DATE |
|----------|--------------|-------------|----------|--------------|
| 100 | SmallTech | 2001 | 5844HAJ | 11/22/2017 |
| 100 | SmallTech | 3188 | 5521LRO | 12/31/2017 |
| 200 | RealSolution | 5109 | 8715JUI | 05/01/2017 |
| 100 | SmallTech | 3232 | 8715JUI | 11/01/2017 |
| 200 | RealSolution | 2101 | 4715TEN | 01/01/2017 |
Run Code Online (Sandbox Code Playgroud)
如您所见,第三行和第四行显示同一部件号的两个不同供应商。
这是我当前的查询:
WITH
-- various other subqueries …Run Code Online (Sandbox Code Playgroud) 我正在寻找按日期时间值在分区上运行窗口函数的最佳方法。但是,我不想按确切时间分区,而是希望按日期时间分区,例如彼此相差 15 分钟以内的日期时间。
这是我桌子上的一小部分。
CREATE TABLE my_table(ID VARCHAR(5), in_time DATETIME)
INSERT INTO my_table (ID, in_time) VALUES
('4844', '2017-04-06 10:15:00.000'),
('5221', '2017-11-24 11:18:00.000'),
('5221', '2017-11-24 11:18:00.000'),
('5221', '2017-11-25 14:23:00.000'),
('8486', '2017-10-10 15:30:00.000'),
('8486', '2017-10-10 15:32:00.000'),
('8486', '2017-10-10 15:46:00.000'), -- new row after updating question
('8486', '2017-10-10 16:00:00.000') -- new row after updating question
Run Code Online (Sandbox Code Playgroud)
这是我现在使用的查询:
SELECT *,
ROW_NUMBER() OVER(PARTITION BY ID, in_time ORDER BY ID, in_time) AS filter_row
FROM my_table
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这给了我这个:
ID in_time filter_row
4844 2017-04-06 10:15:00.000 1
5221 2017-11-24 11:18:00.000 1 …Run Code Online (Sandbox Code Playgroud) 我有下表。
First_Value满足条件时可以创建窗口函数吗?
例如,当 is = 1 时我需要第一个值并按 id 分区
表A
ID Date IS
1 1/1/18 0
1 1/2/18 1
Run Code Online (Sandbox Code Playgroud)
我的工作:
SELECT
CASE
WHEN A.IS = 1 THEN A.DATE END)OVER (PARTITION BY A.ID ORDER BY A.DATE)
END FIRST_ATTEMPT_DT
FROM TABLEA A
Run Code Online (Sandbox Code Playgroud) 我想计算 Snowflake 中各行的累积乘积。
基本上我的月费是随着时间的推移而倍增的。
(有些数据库有product()相应的 SQL 函数)。
给定一个像这样的表:
| 人物ID | 联系日 | 最后联系天数 | 破折号组 |
|---|---|---|---|
| 1 | 2015-02-09 | 1 | |
| 1 | 2015-05-01 | 81 | 2 |
| 1 | 2015-05-02 | 1 | 2 |
| 1 | 2015-05-03 | 1 | 2 |
| 1 | 2015-06-01 | 29 | 3 |
| 1 | 2015-08-01 | 61 | 4 |
| 1 | 2015-08-04 | 3 | 4 |
| 1 | 2015-09-01 | 28 | 5 |
| 2 | 2015-05-01 | 1 | |
| 2 | 2015-06-01 | 31 | 2 |
| 2 | 2015-07-01 | 30 | 3 |
| 3 | 2015-05-01 | 1 | |
| 3 | 2015-05-02 | 1 | 1 |
| 3 | 2015-05-04 | 2 | 1 |
| 3 | 2015-06-01 | 28 | 2 |
| 3 | 2015-06-02 | 1 | 2 |
| 3 | 2015-06-06 | 4 | 3 |
另请参阅DB Fiddle 示例。
如何识别连续几天的连续但允许最大差距?
数据中的原始列是person_id和contact_day …
我正在尝试使用按日期排序的组中的NULL先前值填充多个列(不同列类型 INT、VARCHAR)中的值。NOT NULL考虑下表:
CREATE TABLE IF NOT EXISTS test (
id VARCHAR,
date DATE,
value_1 INT,
value_2 VARCHAR
);
INSERT INTO test VALUES
(1, '2022-01-04', 5, 'asdf'),
(1, '2022-01-03', NULL, NULL),
(1, '2022-01-02', NULL, 'def'),
(1, '2022-01-01', 4, NULL),
(2, '2022-01-04', 1, 'a'),
(2, '2022-01-03', NULL, NULL),
(2, '2022-01-02', 2, 'b'),
(2, '2022-01-01', NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
我想到达这里(请考虑 value_1 --> INTEGER、value_2 字符串):
window-functions ×10
sql ×7
postgresql ×4
oracle ×2
apache-spark ×1
datetime ×1
hsqldb ×1
max ×1
partition-by ×1
scala ×1
snowflake-cloud-data-platform ×1
sql-server ×1