如何在具有 order by 和 count() 的 SQL 中使用两个查询的并集
How to use union of two queries in SQL that has order by and count()
我有以下两个查询 我如何使用 union
以便在单个查询执行中看到两个结果
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC;
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC;
样本输出
样本输出
只需在这些查询之间添加 UNION ALL。当应用 UNION ALL 时,ORDER BY 子句将不接受。所以我把它们放在一个内部集合中得出结论。
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
UNION ALL
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
)AS A
ORDER BY TOTAL_COUNT DESC;
根据情况可以走这条路。如果您的情况是单独下单,则可以in inner set下单。
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
ORDER BY TOTAL_COUNT DESC;
)AS B
UNION ALL
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
ORDER BY TOTAL_COUNT DESC;
)AS A
您可以通过 row_number() over(partition by..
来做到这一点,
select
AGE,
DIAGNOSIS_CODE_1,
total_count
from (
select
AGE,
DIAGNOSIS_CODE_1,
count(DIAGNOSIS_CODE_1) as total_count,
row_number() over (partition by AGE order by count(DIAGNOSIS_CODE_1) desc) rnk
from Health
where age in (7, 9)
group by AGE, DIAGNOSIS_CODE_1
) x
where rnk = 1
或者你可以使用union all
喜欢;
with tmp_1 as (
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC
),
tmp_2 as (
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC
)
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_1
union all
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_2
如果您想使用联合,您可以尝试以下查询。
(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1 ) union
(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1) order by total_count DESC;
对于这个特定的查询,我建议您使用 where age IN (7,9)
,这样可以减少工作量。
当 UNION 语句中的任何 SELECT 语句包含 ORDER BY 子句时,该子句应放在所有 SELECT 语句之后。Using UNION of two SELECT statements with ORDER BY
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
FROM Health
WHERE Age = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
UNION ALL
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
FRPM Health
WHERE Age = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
) AS T
ORDER BY total_count DESC;
你必须使用这样的东西。我没有使用 union,而是计算 2 个不同年龄组的数量,然后在其中选择最大数量
SELECT t1.age,
t1.diagnosis_code_1,
t1.total_count
FROM (SELECT t.*,
Rank()
OVER (
partition BY age
ORDER BY total_count DESC) AS tc
FROM (SELECT age,
diagnosis_code_1,
Count(diagnosis_code_1) AS total_count
FROM health
WHERE age IN ( 7, 9 )
GROUP BY age,
diagnosis_code_1
) t
) t1
WHERE t1.tc = 1
您可以使用相同的查询并修改或删除 WHERE age IN ( 7, 9 )
子句以获得更多 age
组的 count
。
我有以下两个查询 我如何使用 union
以便在单个查询执行中看到两个结果
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC;
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC;
样本输出
样本输出
只需在这些查询之间添加 UNION ALL。当应用 UNION ALL 时,ORDER BY 子句将不接受。所以我把它们放在一个内部集合中得出结论。
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
UNION ALL
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
)AS A
ORDER BY TOTAL_COUNT DESC;
根据情况可以走这条路。如果您的情况是单独下单,则可以in inner set下单。
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
ORDER BY TOTAL_COUNT DESC;
)AS B
UNION ALL
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT
FROM HEALTH
WHERE AGE = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
ORDER BY TOTAL_COUNT DESC;
)AS A
您可以通过 row_number() over(partition by..
来做到这一点,
select
AGE,
DIAGNOSIS_CODE_1,
total_count
from (
select
AGE,
DIAGNOSIS_CODE_1,
count(DIAGNOSIS_CODE_1) as total_count,
row_number() over (partition by AGE order by count(DIAGNOSIS_CODE_1) desc) rnk
from Health
where age in (7, 9)
group by AGE, DIAGNOSIS_CODE_1
) x
where rnk = 1
或者你可以使用union all
喜欢;
with tmp_1 as (
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC
),
tmp_2 as (
select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1
order by total_count DESC
)
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_1
union all
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_2
如果您想使用联合,您可以尝试以下查询。
(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 7
group by AGE, DIAGNOSIS_CODE_1 ) union
(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
from Health
where age = 9
group by AGE, DIAGNOSIS_CODE_1) order by total_count DESC;
对于这个特定的查询,我建议您使用 where age IN (7,9)
,这样可以减少工作量。
当 UNION 语句中的任何 SELECT 语句包含 ORDER BY 子句时,该子句应放在所有 SELECT 语句之后。Using UNION of two SELECT statements with ORDER BY
SELECT * FROM (
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
FROM Health
WHERE Age = 7
GROUP BY AGE, DIAGNOSIS_CODE_1
UNION ALL
SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count
FRPM Health
WHERE Age = 9
GROUP BY AGE, DIAGNOSIS_CODE_1
) AS T
ORDER BY total_count DESC;
你必须使用这样的东西。我没有使用 union,而是计算 2 个不同年龄组的数量,然后在其中选择最大数量
SELECT t1.age,
t1.diagnosis_code_1,
t1.total_count
FROM (SELECT t.*,
Rank()
OVER (
partition BY age
ORDER BY total_count DESC) AS tc
FROM (SELECT age,
diagnosis_code_1,
Count(diagnosis_code_1) AS total_count
FROM health
WHERE age IN ( 7, 9 )
GROUP BY age,
diagnosis_code_1
) t
) t1
WHERE t1.tc = 1
您可以使用相同的查询并修改或删除 WHERE age IN ( 7, 9 )
子句以获得更多 age
组的 count
。