Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按记录类型sql为每个id提取一条记录_Sql - Fatal编程技术网

按记录类型sql为每个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

我是SQL新手,我正在尝试编写一个查询来执行以下操作

我有一个包含记录类型和ID的表。每个ID可以有重复和多个类型

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中的语法谢谢!!!我想我也通过分离查询并将它们连接在一起解决了这个问题,但您的解决方案似乎更紧凑,运行速度可能更快。