2016-06-10 118 views
0

所以我想从col1或col2等于变量的表中选择行,但是如果已经有行选择,其中col1等于变量(变量X),而col2是其他任何东西(变量Y),那么它不会选择另一行,其中col2等于变量X,col1等于该变量Y.按列TIME降序排列的所有内容。SQL选择其中col1或col2等于变量的行

比方说,这是我的表:

COL1 COL2 TIME COL4 
1  2  0  A 
1  2  1  B 
2  1  2  C 
1  3  3  D 
3  1  4  E 
4  2  5  F 
3  4  6  G 
1  2  7  H 
4  1  8  I 

而且我们说,变量X等于1,那么我想有这些行:

COL1 COL2 TIME COL4 
4  1  8  I 
1  2  7  H 
3  1  4  E 

所以不会告诉我此行

COL1 COL2 TIME COL4 
2  1  2  C 

因为已经有一个组合,其中col1/col2是2/1或1/2。

对不起,如果我解释不好,但我想不出更好的解释。

谢谢你们。

+0

您正在使用哪个数据库管理系统?即SQL Server –

+0

我使用的是WAMP,所以SQL服务器 – Matej

+0

呃,WAMP中的M代表MySQL,所以不是SQL服务器 – Strawberry

回答

1

制作了几个关键假设...

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT MAX(time) time 
     FROM my_table 
     WHERE 1 IN (COL1,COL2) 
     GROUP 
      BY LEAST(col1,col2) 
      , GREATEST(col1,col2) 
    ) b 
    ON b.time = a.time; 
+0

谢谢,这个工作很完美,我在最后附上了“按时间顺序排列”,但那是很容易的部分,谢谢 – Matej

+0

这个解决方案假设时间是主要的,如果不是这样的话,你可能需要适应它。 - 如上面的评论所示 – Strawberry

+0

我已经添加id后使用您的查询,它的工作正常 – Matej

1

编辑:当我认为OP的数据库是SQL Server时,我发布了这个答案。但事实证明,数据库是MySQL。


我觉得这个查询应该这样做:

select t.col1, t.col2, t.time, t.col4 
    from (select t.*, 
       row_number() over (
       partition by 
        case when col1 < col2 then col1 else col2 end, 
        case when col1 < col2 then col2 else col1 end 
       order by time desc) as rn 
      from tbl t 
     where t.col1 = x or t.col2 = x) t 
where t.rn = 1 
order by t.time desc 

的关键部分是定义在这样的方式(1, 2)被视为等同于(2, 1),这是什么case报表做row_numberpartition by条款。一旦分区正常工作,您只需要保留每个“分区”(where t.rn = 1)的第一行以排除重复的行。

+0

聪明的做法和很好的解释。带有'partition by'的'row_number'就是这样一个简洁而有用的函数。 –

+0

我在使用您的代码时遇到了此错误 '#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在附近使用正确的语法''( 分区通过 case col1 Matej

+0

Ha。我认为错误非常明显。 MySQL数据库,而不是SQL Server,就像你在评论中说的那样,我发布的查询不会在MySQL上工作,这就是为什么数据库信息对于这些类型的问题如此重要 – sstan

相关问题