我正在尝试在 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 |
可以使用窗口函数。如果
[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值;如果它们相同,则意味着窗口中只有一个不同的值 - 否则有两个不同的值,所以我们只使用混合标签。
查询:
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 | 保险 | 私人 | 私人+公共 |