以下查询是一个简单的选择,但我需要选择国籍为不同,同时还要选择类型和类别(两者都不相同)。有没有办法呢?
SELECT NATIONALITY,TYPE,CATEGORIE FROM EMPLOYEE
答案 0 :(得分:1)
尝试:
SELECT NATIONALITY,TYPE,CATEGORIE FROM EMPLOYEE
Group by NATIONALITY,TYPE,CATEGORIE
我假设您拥有相同国籍的相同类型和类别。在另一种可能的情况下,您可以为同一国籍设置不同的类别和类型:
每个国籍都有不同的记录,你想为每个国家选择一个,但TYPE和CATEGORY的值应该是多少? 你需要使用聚合函数(Max,Min,Avg ......)选择一个
例如:
SELECT NATIONALITY,max(TYPE),max(CATEGORIE) FROM EMPLOYEE
Group by NATIONALITY
答案 1 :(得分:0)
假设EMPLOYEE表的结构类似于以下 -
NATIONALITY TYPE CATEGORY
American A NR
American C SR
American C SR
American B GEN
Indian A SR
Indian A NR
Indian B NR
Indian B NR
Indian B GEN
Italian C GEN
Italian A SR
Italian B SR
并且要求是为每个NATIONALITY获取一条记录,并且可以为该NATIONALITY提供TYPE和CATEGORY的任意组合。
为此,您可以先在NATIONALITY上对表进行分区,然后添加row_number()。 Partition函数根据指定列的值将表的行映射到分区。在其上使用row_number(),将为每个NATIONALITY添加从1到N的行号。然后,这可以与row_number()= 1的where子句一起使用。
SELECT *, row_number() over(partition by NATIONALITY order by Nationality)
as RowNum from EMPLOYEE
结果如下:
NATIONALITY TYPE CATEGORY RowNum
American A NR 1
American C SR 2
American C SR 3
American B GEN 4
Indian A SR 1
Indian A NR 2
Indian B NR 3
Indian B NR 4
Indian B GEN 5
Italian C GEN 1
Italian A SR 2
Italian B SR 3
现在上面的表可以在Common Table Expression(CTE)下使用,并且可以很容易地查询RowNum = 1。 可以将CTE视为在单个SELECT的执行范围内定义的临时结果集。它不作为对象存储,仅在查询期间持续。
WITH MyCte AS
(
SELECT *,row_number() over(partition by NATIONALITY order by Nationality)
as RowNum
from EMPLOYEE
)
SELECT NATIONALITY, [TYPE], CATEGORY
FROM MyCte
WHERE RowNum =1
结果如下:
NATIONALITY TYPE CATEGORY
American A NR
Indian A SR
Italian C GEN