按记录类型sql为每个id提取一条记录
我是SQL新手,我正在尝试编写一个查询来执行以下操作 我有一个包含记录类型和ID的表。每个ID可以有重复和多个类型按记录类型sql为每个id提取一条记录,sql,Sql,我是SQL新手,我正在尝试编写一个查询来执行以下操作 我有一个包含记录类型和ID的表。每个ID可以有重复和多个类型 Type ID History 1 History 1 Geography 1 Geography 2 French 2 French 3 English 3 English 4 Hi
Type ID
History 1
History 1
Geography 1
Geography 2
French 2
French 3
English 3
English 4
History 4
History 4
我想为每个ID创建一个记录,其中包含历史、地理和所有其他的“类型层次结构”。因此,在上面的示例中,我寻找以下内容:
History 1
Geography 2
French 3
History 4
换句话说,给我所有的历史记录,如果一个ID没有历史记录,给我地理记录,对于没有历史记录的ID,给我任何一种记录类型
有什么想法吗
谢谢 我认为有些事情与
SELECT Type, ID
GROUP BY Type, ID
应该可以工作。您没有告诉RDM,但以下代码适用于Oracle(我想还有SQL Server)。对于其他函数,有对
行数
函数的模拟
--creating table..
CREATE TABLE "YOURTABLE"
( "TIP" VARCHAR2(20),
"IDE" NUMBER
)
--inserting experimental values..
insert into YOURTABLE (TIP, IDE)
values ('History', 1);
insert into YOURTABLE (TIP, IDE)
values ('History', 1);
insert into YOURTABLE (TIP, IDE)
values ('Geography', 1);
insert into YOURTABLE (TIP, IDE)
values ('Geography', 2);
insert into YOURTABLE (TIP, IDE)
values ('French', 2);
insert into YOURTABLE (TIP, IDE)
values ('French', 3);
insert into YOURTABLE (TIP, IDE)
values ('English', 3);
insert into YOURTABLE (TIP, IDE)
values ('English', 4);
insert into YOURTABLE (TIP, IDE)
values ('History', 4);
insert into YOURTABLE (TIP, IDE)
values ('History', 4);
--code..
select m.*
from (select *
from YOURTABLE
where tip = 'History'
union
select *
from YOURTABLE
where tip = 'Geography'
and ide not in (select ide from YOURTABLE where tip = 'History')
union
select tip, ide
from (select s.*,
ROW_NUMBER() OVER(PARTITION BY ide ORDER BY ide) ord
from YOURTABLE s
where tip not in ('History', 'Geography')
and ide not in
(select ide
from YOURTABLE
where tip in ('History', 'Geography')))
where ord = 1) m
结果表:
TIP IDE
-------------------- ----------
History 1
Geography 2
English 3
History 4
你说:
历史、地理等的“类型层次”
在我的例子中,结果是英语,而不是法语,但这不应该是一个问题,因为“所有其他人”都是平等的 您已经列出了两次
历史记录
,这是错误吗?也没有英语
?不,这不是错误。可以有相同的类型和ID,但有不同的开始/结束日期(我没有在表中列出),这些日期用于确定要选择的类型吗?如果是的话,那么你应该包括这些,因为你如何决定选择哪个history
记录?也许我没有很好地解释这一点。我想要每个ID中的一个(1,2,3,4)。但是我想要的记录是基于类型的。如果有历史记录,那么我想要这一条,如果没有,那么拉地理记录,否则如果没有历史或地理记录,那么拉任何其他记录。只有当结束日期不为空时,日期才相关,但可能有多条记录具有“开放”结束日期,并且记录上的其他信息实际上不相关。然后,我将使用此查询连接到其他表以获取信息,所以只要是历史记录而不是英语记录,任何一个历史记录都可以。谢谢。但我试图根据记录类型,以层次结构的形式,每个ID只提取一条记录。在我以前的工作中,我可以很容易地用传统的代码来实现这一点,但是我不知道SQLS中的语法谢谢!!!我想我也通过分离查询并将它们连接在一起解决了这个问题,但您的解决方案似乎更紧凑,运行速度可能更快。