分区和分组

问题描述 投票:0回答:2

我正在尝试在 Power BI 或 SQL 中计算一些东西,因为这涉及数百万行,性能导致我在 SQL 中执行此操作,但我已经尝试完成这项工作已有一段时间了!

我正在尝试制作一个显示帐户当前状态的计算列

账号 PartnerId 交易 第一笔交易 行数 工业 私人/公共 结果
6906 19 557 01-1-22 1 金融服务 私人 仅限私人
6906 20 557 02-1 月 22 日 2 金融服务 私人 仅限私人
6906 32 30 22 年 1 月 5 日 3 政府 公开 公立+私立
6906 738 2 22 年 1 月 12 日 4 政府 公开 公立+私立
6906 82 5 22 年 1 月 13 日 5 私人 公立+私立
6906 74 1 11-Jun-22 6 金融服务 私人 公立+私立
6906 56 1 27-6-22 7 保险 私人 公立+私立

结果应按发生顺序检查帐户是否有公开或私人交易。我添加了一个排名,按 accountid 分区并按日期排序(= row_num) 但接下来我想要一个可以交叉检查分区内所有值的列。

在上面的这个例子中,这个账户在 01-01 上有标签“仅限私人”,因为它只与私人合作伙伴进行过交易。第二行还写着 Private only,因为它仍然只与私人合作伙伴进行过交易。但是从第三行开始,它变成了 Public + Private,因为它也使用了公共事务。

有人知道我如何计算结果列吗?

编辑: 我的原始查询:

  SELECT ua.[AccountId],
      ua.[PartnerId],
      i.industry,
      i.[Public/Private],
      COUNT(*) AS Transactions,
      MIN(ua.[FilepathDate]) AS FirstTransaction,
      ROW_NUMBER() OVER (PARTITION BY accountid
                         ORDER BY MIN(ua.[FilepathDate] )) 
Partner_row_num

 FROM [dbo].[incremental_UserActions] ua
 INNER JOIN tmp_Industry i ON ua.partnerid = i.partnerid
 WHERE YEAR(ua.[FilepathDate]) = 2022
   AND ua.accountid = 6906
 GROUP BY ua.[AccountId],
        ua.[PartnerId],
        i.industry,
        i.[Public/Private]
        

编辑2: 上面的最终输出看起来像这样:

    | AccountId | FirstTransaction | MonthAgg   | Result            |
| --------- | ---------------- | ---------- | ----------------- |
| 7015      | 05/01/2022       | 01/01/2022 | FAS Only          |
| 7015      | 06/01/2022       | 01/01/2022 | FAS + Other Public|
| 7015      | 19/01/2022       | 01/01/2022 | Public + Private  |
| 7015      | 19/01/2022       | 01/01/2022 | Public + Private  |
| 7015      | 24/01/2022       | 01/01/2022 | Public + Private  |
| 7015      | 08/04/2022       | 01/04/2022 | Public + Private  |
| 7015      | 08/06/2022       | 01/06/2022 | Public + Private  |
| 7799      | 04/01/2022       | 01/01/2022 | Private Only      |
| 7799      | 10/01/2022       | 01/01/2022 | Public + Private  |
| 7799      | 08/03/2022       | 01/03/2022 | Public + Private  |
| 7799      | 08/04/2022       | 01/04/2022 | Public + Private  |
| 7799      | 17/12/2022       | 01/12/2022 | Public + Private  |
        

最终结果每个accountid应该有连续的月份。 所以每个帐户每月 1 行

| AccountId | FirstTransaction | MonthAgg   | Result           |
| --------- | ---------------- | ---------- | ---------------- |
| 7015      | 24/01/2022       | 01/01/2022 | Public + Private |
| 7015      | 24/01/2022       | 01/02/2022 | Public + Private |
| 7015      | 24/01/2022       | 01/03/2022 | Public + Private |
| 7015      | 08/04/2022       | 01/04/2022 | Public + Private |
| 7015      | 08/04/2022       | 01/05/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/06/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/07/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/08/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/09/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/10/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/11/2022 | Public + Private |
| 7015      | 08/06/2022       | 01/12/2022 | Public + Private |
| 7799      | 10/01/2022       | 01/01/2022 | Public + Private |
| 7799      | 10/01/2022       | 01/02/2022 | Public + Private |
| 7799      | 08/03/2022       | 01/03/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/04/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/05/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/06/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/07/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/08/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/09/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/10/2022 | Public + Private |
| 7799      | 08/04/2022       | 01/11/2022 | Public + Private |
| 7799      | 17/12/2022       | 01/12/2022 | Public + Private |
sql sql-server window-functions
2个回答
0
投票

可以使用窗口函数。如果

[Public/Private]
列中只有两个可能的值,那么,从您现有的查询开始:

SELECT ua.[AccountId],
    ua.[PartnerId],
    i.industry,
    i.[Public/Private],
    COUNT(*) AS Transactions,
    MIN(ua.[FilepathDate]) AS FirstTransaction,
    ROW_NUMBER() OVER (PARTITION BY accountid ORDER BY MIN(ua.[FilepathDate] )) Partner_row_numn,
    CASE WHEN MIN(i.[Public/Private]) OVER((PARTITION BY accountid ORDER BY MIN(ua.[FilepathDate]))
            = MAX(i.[Public/Private]) OVER((PARTITION BY accountid ORDER BY MIN(ua.[FilepathDate]))
        THEN concat( MIN(i.[Public/Private]) OVER((PARTITION BY accountid ORDER BY MIN(ua.[FilepathDate])), ' Only')
        ELSE 'Public + Private'
    END AS Result
FROM [dbo].[incremental_UserActions] ua
INNER JOIN tmp_Industry i ON ua.partnerid = i.partnerid
WHERE YEAR(ua.[FilepathDate]) = 2022 AND ua.accountid = 6906
GROUP BY ua.[AccountId], ua.[PartnerId], i.industry, i.[Public/Private]

思路是比较MIN和MAX值;如果它们相同,则意味着窗口中只有一个不同的值 - 否则有两个不同的值,所以我们只使用混合标签。


0
投票

查询:


with cte as
( 
  select *,
  (case when lag(private_public)over(partition by accountid order by row_num)<>private_public then 1 else 0 end)status
  from accounts
)
select AccountId, PartnerId, Transactions, FirstTransaction, row_num, Industry, Private_Public,(case when sum(status)over(partition by accountid order by row_num)>0 then 'Private + Public' else Private_Public +' only' end) Result from cte

输出:

账号 PartnerId 交易 第一笔交易 行数 工业 私人_公共 结果
6906 19 557 2022-01-01 1 金融服务 私人 仅限私人
6906 20 557 2022-01-02 2 金融服务 私人 仅限私人
6906 32 30 2022-01-05 3 政府 公开 私人+公共
6906 738 2 2022-01-12 4 政府 公开 私人+公共
6906 82 5 2022-01-13 5 私人 私人+公共
6906 74 1 2022-06-11 6 金融服务 私人 私人+公共
6906 56 1 2022-06-27 7 保险 私人 私人+公共

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.