【发布时间】:2018-09-11 12:06:36
【问题描述】:
我有一张如下表:
CREATE TABLE public.test_table
(
"ID" serial PRIMARY KEY NOT NULL,
"CID" integer NOT NULL,
"SEG" integer NOT NULL,
"DDN" character varying(3) NOT NULL
)
数据看起来像这样:
ID CID SEG DDN
1 1 1 "711"
2 1 2 "800"
3 1 3 "124"
4 2 1 "711"
5 3 1 "711"
6 3 2 "802"
7 4 1 "799"
8 5 1 "799"
9 5 2 "804"
10 6 1 "799"
我需要按 CID 列对这些数据进行分组,并获取列计数取决于 DDN 列的第一个值,但计数必须给我两个不同的信息,如果它大于 1。
如果不能解释清楚,我真的很抱歉。让我告诉你我需要什么..
DDN END TRA
711 1 2
799 2 1
如您所见,DDN:711 有 1 条单次计数记录 (ID:4)。这是 END 列。 但是 2 次有多个 SEG 计数(ID:1to3 和 ID:5to6)。这是 TRA 列。
我无法确定 group 子句中应该包含哪一列!
我的解决方案:
刚刚找到如下解决方案
WITH x AS (
SELECT
(SELECT t1."DDN" FROM public.test_table AS t1
WHERE t1."CID"=t."CID" AND t1."SEG"=1) AS ddn,
COUNT("CID") AS seg_count
FROM public.test_table AS t
GROUP BY "CID"
)
SELECT ddn, COUNT(seg_count) AS "TOTAL",
SUM(CASE WHEN x.seg_count=1 THEN 1 ELSE 0 END) as "END",
SUM(CASE WHEN x.seg_count>1 THEN 1 ELSE 0 END) as "TRA"
FROM x
GROUP BY ddn;
【问题讨论】:
-
你必须给我们一个更好的解释你想要什么。我不明白您在示例中如何计算 END 和 TRA。
-
再次抱歉!如果您查看前 3 条记录,CID 值是相同的,并且有 3 条记录意味着我应该算作 TRA(TRAnsferred)。现在让我们看一下第 4 条记录,它的 CID 值为 2,它的单个记录,这意味着我应该将其算作 END(ENDed)。
-
一点解释; ID:1to3 具有相同的 CID,第一个 DDN 是 711。我应该将这个 TRA 计算为 711。ID:4 有单个 CID,第一个 DDN 是 711。我应该将这个 END 计算为 711。ID:5to6 具有相同的 CID,第一个 DDN 是711. 我应该把这个 TRA 算作 711。ID:7 有单个 CID,第一个 DDN 是 799。我应该把这个 END 算作 799。ID:8to9 有相同的 CID,第一个 DDN 是 799。我应该把这个 TRA 算作 799。 ID:10 有单个 CID,第一个 DDN 是 799。我应该把这个 END 算作 799。
-
请不要将其他信息发布为 cmets edit 您的问题。
-
我看到您找到了自己的解决方案。我还建议你一个作为答案。
标签: sql postgresql aggregate greatest-n-per-group