如何 select 一个不同的列表,其中单个引用有 2 个子引用,但每个子引用值也有 1 个以上
How to select a distinct list where a single reference has 2 sub-references but also has more than 1 of each sub-reference value
我正在尝试 select 不同的 TRMANE、TRATSA 列表,其中有多个不同值的 TRASTA 与 TRMANE 关联。
这是 table 的摘录; WHTRANP
TRMANE TRASTA
56819 5
56819 5
56819 4
56833 5
56833 4
56844 5
56844 4
56880 5
56880 5
56880 4
56880 4
N.B。 - 从上面可以看出,可能有多个 TRASTA 与 TRMANE 具有相同的值,我认为这就是导致我出现问题的原因。
理想情况下,我最终会得到;
TRMANE TRASTA
56819 5
56819 4
56833 5
56833 4
56844 5
56844 4
56880 5
56880 4
如果我这样做;
SELECT TRMANE, TRASTA
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, TRSTA
HAVING COUNT(TRASTA) > 2
ORDER BY 1, 2 DESC
它 returns 一个不同的清单列表,无论它们是否具有 2 个 TRASTAS - 即;
TRMANE TRASTA
4 5
5 5
7 5
8 5
9 5
10 5
11 5
13 5
14 5
15 5
16 5
这是哪里;
SELECT TRMANE as TRMANE, TRASTA AS TRASTA
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, trasta
HAVING COUNT(DISTINCT TRASTA) > 2
ORDER BY 1, 2 DESC
没有结果。
假设您的 DB2 版本支持窗口函数:
select *
from
(
SELECT TRMANE, TRASTA, -- distinct combinations
COUNT(*) OVER (PARTITION BY TRMANE) AS cnt -- number of rows per TRMANE
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, TRSTA
) as dt
WHER cnt > 1 -- more than 1 distinct values
ORDER BY 1, 2 DESC
您的查询正在查找 trMane
链接到多个(唯一)traSta
的那些行。就其本身而言,这很简单:
SELECT trMane
FROM WHTranP
GROUP BY trMane
HAVING COUNT(DISTINCT traSta) > 1
问题当然是获取所有这些 traSta
值。分组移除了我们输出它们的能力(除非窗口函数可用),所以我们需要做一些别的事情:再次加入 table。
SELECT DISTINCT WHTranP.trMane, WHTranP.traSta
FROM WHTranP
JOIN (SELECT trMane
FROM WHTranP
GROUP BY trMane
HAVING COUNT(DISTINCT traSta) > 1) Multiples
ON Multiples.trMane = WHTranP.trMane
ORDER BY WHTranP.trMane, WHTranP.traSta
...通过加入我们之前生成的列表,现在我们需要做的就是删除重复的 traSta
值,外部 DISTINCT
很容易为我们处理这些值。
我正在尝试 select 不同的 TRMANE、TRATSA 列表,其中有多个不同值的 TRASTA 与 TRMANE 关联。
这是 table 的摘录; WHTRANP
TRMANE TRASTA
56819 5
56819 5
56819 4
56833 5
56833 4
56844 5
56844 4
56880 5
56880 5
56880 4
56880 4
N.B。 - 从上面可以看出,可能有多个 TRASTA 与 TRMANE 具有相同的值,我认为这就是导致我出现问题的原因。
理想情况下,我最终会得到;
TRMANE TRASTA
56819 5
56819 4
56833 5
56833 4
56844 5
56844 4
56880 5
56880 4
如果我这样做;
SELECT TRMANE, TRASTA
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, TRSTA
HAVING COUNT(TRASTA) > 2
ORDER BY 1, 2 DESC
它 returns 一个不同的清单列表,无论它们是否具有 2 个 TRASTAS - 即;
TRMANE TRASTA
4 5
5 5
7 5
8 5
9 5
10 5
11 5
13 5
14 5
15 5
16 5
这是哪里;
SELECT TRMANE as TRMANE, TRASTA AS TRASTA
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, trasta
HAVING COUNT(DISTINCT TRASTA) > 2
ORDER BY 1, 2 DESC
没有结果。
假设您的 DB2 版本支持窗口函数:
select *
from
(
SELECT TRMANE, TRASTA, -- distinct combinations
COUNT(*) OVER (PARTITION BY TRMANE) AS cnt -- number of rows per TRMANE
FROM WHTRANP
WHERE TRMANE <> 0
GROUP BY TRMANE, TRSTA
) as dt
WHER cnt > 1 -- more than 1 distinct values
ORDER BY 1, 2 DESC
您的查询正在查找 trMane
链接到多个(唯一)traSta
的那些行。就其本身而言,这很简单:
SELECT trMane
FROM WHTranP
GROUP BY trMane
HAVING COUNT(DISTINCT traSta) > 1
问题当然是获取所有这些 traSta
值。分组移除了我们输出它们的能力(除非窗口函数可用),所以我们需要做一些别的事情:再次加入 table。
SELECT DISTINCT WHTranP.trMane, WHTranP.traSta
FROM WHTranP
JOIN (SELECT trMane
FROM WHTranP
GROUP BY trMane
HAVING COUNT(DISTINCT traSta) > 1) Multiples
ON Multiples.trMane = WHTranP.trMane
ORDER BY WHTranP.trMane, WHTranP.traSta
...通过加入我们之前生成的列表,现在我们需要做的就是删除重复的 traSta
值,外部 DISTINCT
很容易为我们处理这些值。