计算不同的和 window 个函数
count distinct and window functions
我有一个 ID、交易、这些交易的日期以及这些交易的类别的列表。我想在每个 ID
中创建每个不同类别的计数
我的起始 table 看起来像这样:
id trxn_dt trxn_amt trxn_category
1 10/31/2014 58 apple
1 11/9/2014 34 banana
1 12/10/2014 12 apple
2 7/8/2014 78 banana
2 11/20/2014 99 banana
3 1/5/2014 120 orange
4 2/17/2014 588 apple
4 2/18/2014 8 banana
4 3/9/2014 65 orange
4 4/25/2014 74 apple
我希望最终结果看起来像这样:
id trxn_dt trxn_amt trxn_category number_category
1 10/31/2014 58 apple 2
1 11/9/2014 34 banana 2
1 12/10/2014 12 apple 2
2 7/8/2014 78 banana 1
2 11/20/2014 99 banana 1
3 1/5/2014 120 orange 1
4 2/17/2014 588 apple 3
4 2/18/2014 8 banana 3
4 3/9/2014 65 orange 3
4 4/25/2014 74 apple 3
我试过使用 count(distinct(trxn_category)) over(partition by id,trxn_category order by id) as number_category
但我在使用 'distinct'
时遇到错误
您可以为此使用相关子查询:
SELECT id, trxn_dt, trxn_amt, trxn_category,
(SELECT COUNT(DISTINCT trxn_category)
FROM mytable AS t2
WHERE t2.id = t1.id) AS cnt
FROM mytable AS t1
;WITH cteCounts AS (
SELECT
id
,COUNT(DISTINCT trxn_category) as CategoryCount
FROM
table
GROUP BY
id
)
SELECT
t.id
,trxn_dt
,trxn_amt
,trxn_category
,c.CategoryCount
FROM
table t
INNER JOIN cteCounts c
ON t.id = c.id
不能在分区聚合中使用 DISTINCT。
大多数 DBMS 在窗口函数中不支持 DISTINCT,但您可以使用两个 DENSE_RANKs:
模拟 COUNT(DISTINCT)
DENSE_RANK() over (partition by id,trxn_category order by id ASC)-
DENSE_RANK() over (partition by id,trxn_category order by id DESC)
或嵌套的 MAX(DENSE_RANK):
select
MAX(dr) over (partition by id,trxn_category)
from
(
select
DENSE_RANK() over (partition by id,trxn_category order by id DESC) as dr
)
我有一个 ID、交易、这些交易的日期以及这些交易的类别的列表。我想在每个 ID
中创建每个不同类别的计数我的起始 table 看起来像这样:
id trxn_dt trxn_amt trxn_category
1 10/31/2014 58 apple
1 11/9/2014 34 banana
1 12/10/2014 12 apple
2 7/8/2014 78 banana
2 11/20/2014 99 banana
3 1/5/2014 120 orange
4 2/17/2014 588 apple
4 2/18/2014 8 banana
4 3/9/2014 65 orange
4 4/25/2014 74 apple
我希望最终结果看起来像这样:
id trxn_dt trxn_amt trxn_category number_category
1 10/31/2014 58 apple 2
1 11/9/2014 34 banana 2
1 12/10/2014 12 apple 2
2 7/8/2014 78 banana 1
2 11/20/2014 99 banana 1
3 1/5/2014 120 orange 1
4 2/17/2014 588 apple 3
4 2/18/2014 8 banana 3
4 3/9/2014 65 orange 3
4 4/25/2014 74 apple 3
我试过使用 count(distinct(trxn_category)) over(partition by id,trxn_category order by id) as number_category
但我在使用 'distinct'
您可以为此使用相关子查询:
SELECT id, trxn_dt, trxn_amt, trxn_category,
(SELECT COUNT(DISTINCT trxn_category)
FROM mytable AS t2
WHERE t2.id = t1.id) AS cnt
FROM mytable AS t1
;WITH cteCounts AS (
SELECT
id
,COUNT(DISTINCT trxn_category) as CategoryCount
FROM
table
GROUP BY
id
)
SELECT
t.id
,trxn_dt
,trxn_amt
,trxn_category
,c.CategoryCount
FROM
table t
INNER JOIN cteCounts c
ON t.id = c.id
不能在分区聚合中使用 DISTINCT。
大多数 DBMS 在窗口函数中不支持 DISTINCT,但您可以使用两个 DENSE_RANKs:
模拟 COUNT(DISTINCT)DENSE_RANK() over (partition by id,trxn_category order by id ASC)-
DENSE_RANK() over (partition by id,trxn_category order by id DESC)
或嵌套的 MAX(DENSE_RANK):
select
MAX(dr) over (partition by id,trxn_category)
from
(
select
DENSE_RANK() over (partition by id,trxn_category order by id DESC) as dr
)