标签: conditional-aggregation

条件聚合性能

我们有以下数据

 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)

sql sql-server query-performance conditional-aggregation

21
推荐指数
1
解决办法
1336
查看次数

从 Snowflake 中的 Postgres 复制 FILTER 子句

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。感谢您提前提供任何帮助!

sql snowflake-cloud-data-platform conditional-aggregation

5
推荐指数
1
解决办法
4861
查看次数

GROUP BY 并为分组的每个唯一值创建列(始终输出为 1 行),然后将输出用作 JOIN - SQL Server

我需要按 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)

sql-server join group-by case conditional-aggregation

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