Oracle 答案很简单。如果我有超过1000万条记录,内存表将如何运行?它能容纳吗?@gwatene:这几乎是Caius Jard的第二个查询。我更喜欢他们的方法:1)使用UNION ALL而不是UNION;2)使用null来简化不同的计数。@Omari Victor
Oracle 答案很简单。如果我有超过1000万条记录,内存表将如何运行?它能容纳吗?@gwatene:这几乎是Caius Jard的第二个查询。我更喜欢他们的方法:1)使用UNION ALL而不是UNION;2)使用null来简化不同的计数。@Omari Victor,oracle,count,distinct,Oracle,Count,Distinct,答案很简单。如果我有超过1000万条记录,内存表将如何运行?它能容纳吗?@gwatene:这几乎是Caius Jard的第二个查询。我更喜欢他们的方法:1)使用UNION ALL而不是UNION;2)使用null来简化不同的计数。@Omari Victor Omosa:对于ALL DESCRIPT结果,您需要一个UNION。您还需要不同的。那很贵,但事实就是这样。为什么不看看不同查询的解释计划,看看优化器是如何考虑成本的?UNION删除重复项,在本例中@Omari required distin
答案很简单。如果我有超过1000万条记录,内存表将如何运行?它能容纳吗?@gwatene:这几乎是Caius Jard的第二个查询。我更喜欢他们的方法:1)使用
UNION ALL
而不是UNION
;2)使用null来简化不同的计数。@Omari Victor Omosa:对于ALL DESCRIPT
结果,您需要一个UNION
。您还需要不同的。那很贵,但事实就是这样。为什么不看看不同查询的解释计划,看看优化器是如何考虑成本的?UNION
删除重复项,在本例中@Omari required distinct for col1,UNION ALL
返回来自results@gwatene:否,您使用的是计数(不同)
,因此,UNION
而不是UNION-ALL
没有任何效果,除了DBMS需要做更多的工作。而且,UNION
当然对整行都有效,所以您删除了一些重复项,保留了其他重复项。
ID_DATE DESCRIPT1 DESCRIPT2
20191001 A R
20191001 D B
20191001 B D
20191001 A B
20191002 A B
20191002 C A
20191002 A B
SELECT
COUNT(distinct DESCRIPT1 || ' - ' || DESCRIPT2) AS ALL_DESCRIPT,
COUNT(DISTINCT DESCRIPT1) AS DESCRIPT_A,
COUNT(DISTINCT DESCRIPT2) AS DESCRIPT_B,
ID_DATE FROM MY_TABLE GROUP BY ID_DATE;
ALL_DESCRIPT DESCRIPT_A DESCRIPT_B ID_DATE
4 3 3 20191001
2 2 2 20191002
INSERT all
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','A','R')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','D','B')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','B','D')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','A','B')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','A','B')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','C','A')
INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','A','B')
SELECT * FROM dual;
SQL> select id_date, count(distinct descript) cnt
2 from (select id_date, descript1 descript from src_data
3 union all
4 select id_date, descript2 descript from src_data
5 )
6 group by id_date
7 order by id_date;
ID_DATE CNT
-------- ----------
20191001 4
20191002 3
SQL>
SQL> select id_date,
2 count(distinct descript) cnt,
3 count(distinct case when what = 'A' then descript end) descript_a,
4 count(distinct case when what = 'B' then descript end) descript_b
5 from (select 'A' what, id_date, descript1 descript from src_data
6 union all
7 select 'B' what, id_date, descript2 descript from src_data
8 )
9 group by id_date
10 order by id_date;
ID_DATE CNT DESCRIPT_A DESCRIPT_B
-------- ---------- ---------- ----------
20191001 4 3 3
20191002 3 2 2
SQL>
select
id_date,
count(distinct descript) all_descript,
count(case when descript = 'A' then 1 end) as descript_a,
count(case when descript = 'B' then 1 end) as descript_B
from
(
select id_date, descript1 descript
from src_data
union all
select id_date, descript2 descript
from src_data
) x
group by id_date
order by id_date;
select
id_date,
count(distinct descript) all_descript,
count(distinct descript1) as descript_a,
count(distinct descript2) as descript_B
from
(
select id_date, descript1 descript, descript1, descript2
from src_data
union all
select id_date, descript2 descript, null, null
from src_data
) x
group by id_date
order by id_date
select t1.all_descript, t2.descript_a, t2.descript_b, id_date
from -- this subquery gets you the overall distinct count
(
select id_date, count(*) as all_descript
from
(
select id_date, descript1 from mytable
union
select id_date, descript2 from my_table
)
group by id_date
) t1
join -- this subquery gets you the separate distinct counts
(
select
id_date,
count(distinct descript1) as descript_a,
count(distinct descript2) as descript_b
from my_table
group by id_date
) t2 using (id_date)
order by id_date;
WITH b AS (
SELECT id_date,DESCRIPT1 col1,descript1,descript2 FROM
SRC_DATA
UNION
SELECT id_date,DESCRIPT2 col1,descript1,descript2 FROM SRC_DATA
)
SELECT id_date,count(DISTINCT col1) col1,count(DISTINCT descript1)
descript1,count(DISTINCT descript2) descript2
FROM b
GROUP BY id_date