【问题标题】:SELECT only on row from a couple unordered identical rows SQL/PostgreSQL仅从一对无序的相同行 SQL/PostgreSQL 中选择行
【发布时间】:2019-03-10 10:07:56
【问题描述】:

在给定下一个表的情况下,我试图只获取两行中的一个:

| fn1 |  o1  |  d1  |    date    | fn2 |  o2  |  d2  |
------------------------------------------------------
|  1  | ATL  | PEK  | 2018-09-29 |  7  | PEK  | ATL  |
|  7  | PEK  | ATL  | 2018-09-29 |  1  | ATL  | PEK  |

我将第一行称为 R1,第二行称为 R2。

在一般情况下,我需要检查:

R1.fn1 = R2.dn2 AND R1.fn2 = R2.fn1 AND R1.o1 = R1.d2 = R2.d1 = R2.o1 AND R1.d1 = R1.o2 = R2.o1 = R2.d2 AND R1.date = R2.date

如果我的表中的任何 2 个给定行都是这样,我需要将它们分组为一个。 我不知道是否有办法使用 Group By 或 Distinct 来解决它。 我已经尝试了几个查询,但我最终无法删除冗余。

为了提供更多信息,我将解释提供的表格的来源。我有下表:

CREATE TABLE flights (
flightNumber SERIAL PRIMARY KEY,
origin CHAR(3) REFERENCES airports(code),
destination CHAR(3) REFERENCES airports(code),
departureTime TIMESTAMP NOT NULL,
seatsNumber INT NOT NULL,
airlineAbv VARCHAR(10) REFERENCES airlines(abv));

我需要一个查询来检查同一天可能的往返行程。 为此我使用了:

CREATE VIEW AtoB AS
SELECT flightNumber fN1, origin o1, destination d1, departureTime::DATE dT1
FROM flights;

CREATE VIEW BtoA AS
    SELECT flightNumber fN2, origin o2, destination d2, departureTime::DATE dT2
    FROM flights;

CREATE VIEW AtoBtoA AS
    SELECT * FROM AtoB, BtoA WHERE o1 = d2 AND o2 = d1 AND dT1 = dT2;

从最后一个查询中,我得到了一个与示例中的表非常相似的表。示例中的那个更简单一点,以便更容易解释我想要实现的概念。

我希望我能弄清楚我的问题。

Ps:这里有我的整个数据库,可以看设计。我想它可能有用。

CREATE TABLE airports (
    code CHAR(3) PRIMARY KEY,
    city VARCHAR(30) NOT NULL
);

CREATE TABLE airlines (
    name VARCHAR(30) NOT NULL,
    abv VARCHAR(10) PRIMARY KEY
);

CREATE TABLE passengers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(60) NOT NULL
);

CREATE TABLE flights (
    flightNumber SERIAL PRIMARY KEY,
    origin CHAR(3) REFERENCES airports(code),
    destination CHAR(3) REFERENCES airports(code),
    departureTime TIMESTAMP NOT NULL,
    seatsNumber INT NOT NULL,
    airlineAbv VARCHAR(10) REFERENCES airlines(abv)
);

CREATE TABLE bookings (
    passengerId INT REFERENCES passengers(id),
    bookDate TIMESTAMP NOT NULL,
    price REAL NOT NULL,
    flightId INT REFERENCES flights(flightNumber)
);

【问题讨论】:

  • 您是要删除行还是只显示唯一集?
  • 只显示唯一集

标签: sql postgresql select group-by distinct


【解决方案1】:

我不确定您的表格列表是什么。但是对于您的原始问题,您可以使用union allnot exists

select t.*
from t
where fn1 < fn2 and o1 = d2 and d1 = o2 or
      (o1 <> d2 or d1 <> o2)
union all
select t.*
from t t2
where fn1 > fn2 and o1 = d2 and d1 = o2 and
      not exists (select 1
                  from t t2
                  where t2.fn1 = t.fn2 and t2.fn2 = t2.fn1 and
                        t2.o1 = t.d1 and t2.d1 = t.o1 and
                        t2.date = t.date
                 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多