我有一个myTable
有3列的表.col_1
是一个INTEGER
和另外两列是DOUBLE
.例如,col_1={1, 2}, col_2={0.1, 0.2, 0.3}
.in中的每个元素col_1
都包含所有值,col_2
并且col_2
每个元素都有重复的值col_1
.第3列可以具有任何值,如下所示:
col_1 | col_2 | Value
----------------------
1 | 0.1 | 1.0
1 | 0.2 | 2.0
1 | 0.2 | 3.0
1 | 0.3 | 4.0
1 | 0.3 | 5.0
2 | 0.1 | 6.0
2 | 0.1 | 7.0
2 | 0.1 | 8.0
2 | 0.2 | 9.0
2 | 0.3 | 10.0
Run Code Online (Sandbox Code Playgroud)
我想要的是 …
我在SQL的Partition By语句中使用了多列,但是返回了重复的行。我只希望返回不同的行。
这是我在Partition By中编写的代码:
SELECT DATE, STATUS, TITLE, ROW_NUMBER() OVER (PARTITION BY DATE, STATUS, TITLE ORDER BY QUANTITY ASC) AS Row_Num
FROM TABLE
Run Code Online (Sandbox Code Playgroud)
这是我当前得到的输出:(如果有重复的行返回,请参考第6至8行)
这是我想要实现的输出:(没有重复的行被返回- 请参考第6至8行)
问题:如何在“ 1个分区依据”中放置多列并确保不返回任何重复行?
感谢有人可以在这方面为我提供帮助,非常感谢!
我有一个表,我想使用 Kusto 查询语言获取每个组的最新条目。这是表格:
文档状态日志
ID | 文档ID | 地位 | 创建日期 |
---|---|---|---|
2 | 1 | S1 | 2011年7月29日 |
3 | 1 | S2 | 2011年7月30日 |
6 | 1 | S1 | 2011年8月2日 |
1 | 2 | S1 | 2011年7月28日 |
4 | 2 | S2 | 2011年7月30日 |
5 | 2 | S3 | 2011年8月1日 |
6 | 3 | S1 | 2011年8月2日 |
该表将按 DocumentID 分组并按 DateCreated 降序排序。对于每个 DocumentID,我想获取最新状态。
我的首选输出:
文档ID | 地位 | 创建日期 |
---|---|---|
1 | S1 | 2011年8月2日 |
2 | S3 | 2011年8月1日 |
3 | S1 | 2011年8月2日 |
有没有办法使用 KQL 只获取每个组中的顶部?
GetOnlyTheTop伪代码如下:
SELECT
DocumentID,
GetOnlyTheTop(Status),
GetOnlyTheTop(DateCreated)
FROM DocumentStatusLogs
GROUP BY DocumentID
ORDER BY DateCreated DESC
Run Code Online (Sandbox Code Playgroud)
图片来源:改编自 DPP 的 SQL 问题:获取每组的前 1 行
group-by partition-by kql azure-data-explorer kusto-explorer
我正在尝试利用 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) 我在 Snowflake 有一张桌子。表中的一列称为obj_key
(对象键)。表大小非常大(以 TB 为单位),因此性能要求很高。
现在,每次完成对象更新时都会向表中添加一个新条目。新插入的行在列中具有相同obj_key
但不同的条目time_modified
。假设我想obj_key
在某些条件下获取与表不同的数据。
我有以下三种方法:
方法一:
SELECT obj_key
FROM my_table
WHERE some_condition
GROUP BY obj_key;
Run Code Online (Sandbox Code Playgroud)
方法二:
SELECT distinct(obj_key)
FROM my_table
WHERE some_condition;
Run Code Online (Sandbox Code Playgroud)
方法三:
SELECT obj_key
FROM my_table
WHERE some_condition
QUALIFY ROW_NUMBER() OVER (PARTITION BY obj_key ORDER BY obj_key) = 1;
Run Code Online (Sandbox Code Playgroud)
所以基本上我的问题可以归结为这些:
我读过,distinct
在多个列上是由 执行的group_by(col1, col2, ..., col n)
。那么两者的性能有何不同(如果有的话)?
既然PARTITION BY
还需要一个ORDER BY
,那么它不会大大降低性能吗?
如果有人能够提供这些查询如何在 SnowFlake 上运行的细节,我会很高兴。
database group-by distinct partition-by snowflake-cloud-data-platform
我有表结构,如:
CREATE TABLE new_test
( col1 NUMBER(2) NOT NULL,
col2 VARCHAR2(50) NOT NULL,
col3 VARCHAR2(50) NOT NULL,
col4 VARCHAR2(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
它有数据:
col1 col2 col3 col4
0 A B X
1 A B Y
2 A B Z
1 C D L
3 C D M
Run Code Online (Sandbox Code Playgroud)
我需要找到col4的值,它对col2和col3的组合具有最大值.例如我的结果应该是:
col4
Z
M
Run Code Online (Sandbox Code Playgroud)
我尝试使用oracle分析函数:
SELECT col4, MAX(col1) OVER (PARTITION BY col2, col3) FROM (
SELECT col2, col3, col4, col1
FROM new_test);
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作.你能帮我解决这个问题吗?
更新:我可以使用:
SELECT a.col4
FROM new_test a,
(SELECT col2,
col3,
col4, …
Run Code Online (Sandbox Code Playgroud) 我有一个SQL服务器表,我试图获取一个计算列 - MyPartition - 指示基于变量@segment的分区数.例如,如果@segment = 3,则以下输出为真.
RowID | RowName | MyPartition
------ | -----------| -------
1 | My Prod 1 | 1
2 | My Prod 2 | 1
3 | My Prod 3 | 1
4 | My Prod 4 | 2
5 | My Prod 5 | 2
6 | My Prod 6 | 2
7 | My Prod 7 | 3
8 | My Prod 8 | 3
9 | My Prod 9 | 3
10 …
Run Code Online (Sandbox Code Playgroud) 我有一张数据表,
ID SEQ EFFDAT
------- --------- -----------------------
1024 1 01/07/2010 12:00:00 AM
1024 3 18/04/2017 12:00:00 AM
1024 2 01/08/2017 12:00:00 AM
Run Code Online (Sandbox Code Playgroud)
当我执行以下查询时,我得到错误的最大序列仍然得到正确的最大生效日期.
查询:
SELECT
max(seq) over (partition by id order by EFFDAT desc) maxEffSeq,
partitionByTest.*,
max(EFFDAT) over (partition by (id) order by EFFDAT desc ) maxeffdat
FROM partitionByTest;
Run Code Online (Sandbox Code Playgroud)
输出:
MAXEFFSEQ ID SEQ EFFDAT MAXEFFDAT
---------- ---------- ---------- ------------------------ ------------------------
2 1024 2 01/08/2017 12:00:00 AM 01/08/2017 12:00:00 AM
3 1024 3 18/04/2017 12:00:00 AM 01/08/2017 12:00:00 AM
3 1024 …
Run Code Online (Sandbox Code Playgroud) 我遇到了与此问题非常相似的问题 T-sql Reset Row number on Field Change
这个问题的解决方案很完美,效果很好。除非我尝试使用多个其他“custno”,否则它会崩溃。
我的意思是:
custno moddate who
--------------------------------------------------
581827 2012-11-08 08:38:00.000 EMSZC14
581827 2012-11-08 08:41:10.000 EMSZC14
581827 2012-11-08 08:53:46.000 EMSZC14
581827 2012-11-08 08:57:04.000 EMSZC14
581827 2012-11-08 08:58:35.000 EMSZC14
581827 2012-11-08 08:59:13.000 EMSZC14
581827 2012-11-08 09:00:06.000 EMSZC14
581827 2012-11-08 09:04:39.000 EMSZC49 Reset row number to 1
581827 2012-11-08 09:05:04.000 EMSZC49
581827 2012-11-08 09:06:32.000 EMSZC49
581827 2012-11-08 09:12:03.000 EMSZC49
581827 2012-11-08 09:12:38.000 EMSZC49
581827 2012-11-08 09:14:18.000 EMSZC49
581827 2012-11-08 09:17:35.000 EMSZC14 Reset row number to 1 …
Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的数据框:
+----+----+----+
|colA|colB|colC|
+----+----+----+
|1 |1 |23 |
|1 |2 |63 |
|1 |3 |null|
|1 |4 |32 |
|2 |2 |56 |
+----+----+----+
Run Code Online (Sandbox Code Playgroud)
我应用以下说明,以便在 C 列中创建一系列值:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._
df.withColumn("colD",
collect_list("colC").over(Window.partitionBy("colA").orderBy("colB")))
Run Code Online (Sandbox Code Playgroud)
结果是这样的,即创建列 D 并在删除null
值时将列 C 的值包含为一个序列:
+----+----+----+------------+
|colA|colB|colC|colD |
+----+----+----+------------+
|1 |1 |23 |[23] |
|1 |2 |63 |[23, 63] |
|1 |3 |null|[23, 63] |
|1 |4 |32 |[23,63,32] |
|2 |2 |56 |[56] |
+----+----+----+------------+
Run Code Online (Sandbox Code Playgroud)
但是,我想在新列中保留空值并得到以下结果:
+----+----+----+-----------------+
|colA|colB|colC|colD |
+----+----+----+-----------------+
|1 |1 |23 |[23] …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Microsoft SQL Server。我有一个表用户 ID 和登录日期。我将日期最初存储为日期时间,但我将它们转换为日期。我需要显示按用户 ID 分组的每次登录之间的日期差异;如果用户 ID 更改,我希望该函数不计算登录之间的差异。我的表的一个例子是:
user_id, login_date
356,2012-03-22
356,2012-03-22
356,2012-03-22
356,2012-03-23
356,2012-07-17
356,2012-07-19
356,2012-07-20
381,2011-11-28
473,2011-12-29
473,2011-12-29
473,2011-12-29
473,2011-12-29
473,2012-01-13
473,2012-01-26
473,2012-01-29
Run Code Online (Sandbox Code Playgroud)
有很多类似的帖子,我试图从中建立我的查询。但是,我输出的 datediff 似乎并不总是与日期匹配。这是我最近的尝试:
;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY login.user_id
ORDER BY login.user_id, login.login_date) AS RN
FROM login)
SELECT a.user_id, a.login_date ,datediff(day, a.login_date, b.login_date)
FROM cte a
LEFT JOIN cte b
ON a.user_id = b.user_id
and a.rn = b.rn -1
Run Code Online (Sandbox Code Playgroud)
输出示例是:
user_id, login_date
356,2012-03-22,0
356,2012-03-22,0
356,2012-03-22,0
356,2012-03-23,0
356,2012-07-17,1
356,2012-07-19,0
356,2012-07-20,0
381,2011-11-28,0
473,2011-12-29,0 …
Run Code Online (Sandbox Code Playgroud) 您好,我正在尝试将每个窗口的最后一个值扩展到该列的窗口的其余部分count
,以便创建一个标志来识别寄存器是否是窗口的最后一个值。我尝试了这种方法,但没有成功。
样本 DF:
\n\nval df_197 = Seq [(Int, Int, Int, Int)]((1,1,7,10),(1,10,4,300),(1,3,14,50),(1,20,24,70),(1,30,12,90),(2,10,4,900),(2,25,30,40),(2,15,21,60),(2,5,10,80)).toDF("policyId","FECMVTO","aux","IND_DEF").orderBy(asc("policyId"), asc("FECMVTO"))\ndf_197.show\n
Run Code Online (Sandbox Code Playgroud)\n\n+--------+-------+---+-------+\n|policyId|FECMVTO|aux|IND_DEF|\n+--------+-------+---+-------+\n| 1| 1| 7| 10|\n| 1| 3| 14| 50|\n| 1| 10| 4| 300|\n| 1| 20| 24| 70|\n| 1| 30| 12| 90|\n| 2| 5| 10| 80|\n| 2| 10| 4| 900|\n| 2| 15| 21| 60|\n| 2| 25| 30| 40|\n+--------+-------+---+-------+\n
Run Code Online (Sandbox Code Playgroud)\n\nval juntar_riesgo = 1\nval var_entidad_2 = $"aux"\n\n//Particionar por uno o dos campos en funcion del valor de la variable juntar_riesgo\n//Se crear\xc3\xa1 window_number_2 basado en este …
Run Code Online (Sandbox Code Playgroud) 我完全为在mysql中从rank()over(按x分区,按y desc排序)创建新列“ LoginRank”而感到困惑。
From sql server i would write the following query, to create a column "Loginrank" that is grouped by "login" and ordered by "id".
select ds.id,
ds.login,
rank() over(partition by ds.login order by ds.id asc) as LoginRank
from tablename.ds
Run Code Online (Sandbox Code Playgroud)
I have the following table.
create table ds (id int(11), login int(11))
insert into ds (id, login)
values (1,1),
(2,1),
(3,1),
(4,2),
(5,2),
(6,6),
(7,6),
(8,1)
Run Code Online (Sandbox Code Playgroud)
I tried applying many existing mysql fixes to my dataset but continue to …
partition-by ×13
sql ×4
group-by ×3
oracle ×3
sql-server ×3
apache-spark ×2
max ×2
rank ×2
row-number ×2
scala ×2
database ×1
datediff ×1
db2 ×1
distinct ×1
kql ×1
lag ×1
mysql ×1
snowflake-cloud-data-platform ×1
sql-order-by ×1
t-sql ×1
window ×1