返回几列相等的表中的行

时间:2019-03-17 00:03:47

标签: sql

我有下表:

Table

我正在尝试编写一些SQL以成对返回Row ID(成对),其中对于两个给定的行,以下条件成立:

  • Item等于
  • Name等于
  • Measure等于
  • Dates重叠

到目前为止,我尝试做的是使用SELECTWHEREGROUP BY返回Row ID(我知道目前缺少日期功能) ):

SELECT rowid FROM techtest GROUP BY Customer, Product, Measure;

但是,这将返回单个Row ID而不是对。例如,我希望得到的回报是Row ID 1和2在一起,因为它们符合列出的所有条件。

我将如何编写此代码以返回符合列出条件的成对行的列表?

2 个答案:

答案 0 :(得分:2)

一种生成预期结果集的解决方案是自行联接表:

SELECT t1.row_id, t2.row_id
FROM mytable t1
INNER JOIN mytable t2 
    ON  t1.item    = t2.item
    AND t1.name    = t2.name
    AND t1.measure = t2.measure
    AND t1.begin_date  <= t2.expiry_date 
    AND t1.expiry_date >= t2.begin_date
    AND t1.row_id  < t2.row_id

逻辑在于ON的{​​{1}}条件:

  • JOIN代表日期范围重叠条件(有关更多详细信息,请参见this SO post)-根据您的RDBMS,可能会有更多直接的解决方案
  • t1.begin_date <= t2.expiry_date AND t1.expiry_date >= t2.begin_date避免在(t1.row_id < t2.row_id1, 2)之类的结果中出现重复

答案 1 :(得分:0)

不确定是否理解正确,但这说明了如何进行:

create table trash ( 
 id integer, 
 ticket text, 
 name text);

insert into trash values(1,'ticket','name1'),(2,'ticket','name1');
insert into trash values(3,'billet','name2'),(4,'billet','name2');

select * from trash 

 ;                                                                                                                                                                                                                                           
+------+----------+--------+
| id   | ticket   | name   |
|------+----------+--------|
| 1    | ticket   | name1  |
| 2    | ticket   | name1  |
| 3    | billet   | name2  |
| 4    | billet   | name2  |
+------+----------+--------+

select distinct(array[least(trash.id,t1.id), greatest(trash.id, t1.id)]) 
from (select * from trash) t1 
left join trash on t1.ticket=trash.ticket 
and t1.name=trash.name 
and trash.id != t1.id;   

+---------+
| array   |
|---------|
| [3, 4]  |
| [1, 2]  |
+---------+