我有下表:
我正在尝试编写一些SQL以成对返回Row ID
(成对),其中对于两个给定的行,以下条件成立:
Item
等于Name
等于Measure
等于Dates
重叠到目前为止,我尝试做的是使用SELECT
,WHERE
和GROUP BY
返回Row ID
(我知道目前缺少日期功能) ):
SELECT rowid FROM techtest GROUP BY Customer, Product, Measure;
但是,这将返回单个Row ID
而不是对。例如,我希望得到的回报是Row ID
1和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_id
,1, 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] |
+---------+