我们有以下数据
IF OBJECT_ID('dbo.LogTable', 'U') IS NOT NULL DROP TABLE dbo.LogTable
SELECT TOP 100000 DATEADD(day, ( ABS(CHECKSUM(NEWID())) % 65530 ), 0) datesent
INTO [LogTable]
FROM sys.sysobjects
CROSS JOIN sys.all_columns
Run Code Online (Sandbox Code Playgroud)
我想计算行数,去年行数和最近十年行数.这可以使用条件聚合查询或使用子查询来实现,如下所示
-- conditional aggregation query
SELECT
COUNT(*) AS all_cnt,
SUM(CASE WHEN datesent > DATEADD(year,-1,GETDATE())
THEN 1 ELSE 0 END) AS last_year_cnt,
SUM(CASE WHEN datesent > DATEADD(year,-10,GETDATE())
THEN 1 ELSE 0 END) AS last_ten_year_cnt
FROM LogTable
-- subqueries
SELECT
(
SELECT count(*) FROM LogTable
) all_cnt,
(
SELECT count(*) FROM LogTable WHERE datesent …Run Code Online (Sandbox Code Playgroud) Postgres 有一个非常有用的方法,叫做FILTERSnowflake 中似乎没有。在 Postgres 中它的工作原理如下:
SELECT
user_id,
MIN(orders.started_at) FILTER (WHERE orders.sequence_in_subscription = 1) as time_of_t1
FROM platform.orders
GROUP BY 1
Run Code Online (Sandbox Code Playgroud)
你会如何在雪花中做到这一点?有没有这么简洁的方法来做到这一点?
可能是一个非常基本的问题,但我对雪花世界相当陌生,之前只真正做过 Postgres。感谢您提前提供任何帮助!
我需要按 2 列(BillingId 和 PaymentType)对数据进行分组 - 没有问题,并且输出 1 行,其中包含唯一的 PaymentType 列- 此步骤存在问题。因此,每个 BillingId 只有 1 行,该表将用于连接数据库中的另一个表。
计费表:
BillingId (unique)
12345
67890
Run Code Online (Sandbox Code Playgroud)
付款表:
PaymentId PaymentType BillingId PaymentAmount
(unique)
12 electronic 12345 62.29
14 electronic 12345 73.28
56 electronic 12345 -62.29
6 electronic 67890 83.58
2 adjustment 67890 30.43
Run Code Online (Sandbox Code Playgroud)
我的代码:
SELECT GroupedTable.*
FROM (SELECT b.BillingId,
p.PaymentType,
SUM(p.PaymentAmount) AS AmountPaid
FROM Billing AS b
LEFT JOIN Payment AS p
ON (b.BillingId = p.BillingId)
GROUP BY b.BillingId, p.PaymentType) AS GroupedTable
Run Code Online (Sandbox Code Playgroud)
输出(显然不正确):
BillingId …Run Code Online (Sandbox Code Playgroud)