如果两个查询的状态都为“已取消”,如何消除查询中的重复项(PostgreSQL)
如果有人可以帮助在这个查询中添加一些语句,如果他们的状态都已取消,则可以消除重复。我不想在我的查询结果中出现的示例的下图中高亮显示如果两个查询的状态都为“已取消”,如何消除查询中的重复项(PostgreSQL),sql,postgresql,duplicates,Sql,Postgresql,Duplicates,如果有人可以帮助在这个查询中添加一些语句,如果他们的状态都已取消,则可以消除重复。我不想在我的查询结果中出现的示例的下图中高亮显示 with cte0 AS ( SELECT * FROM efleet_copy AS e1 INNER JOIN (SELECT mta_id, COUNT(mta_id) FROM efleet_copy WHERE EXTRACT(MONTH FROM service_date) = 02 AND mta_id LIKE '_____
with cte0 AS
(
SELECT * FROM efleet_copy AS e1
INNER JOIN
(SELECT mta_id, COUNT(mta_id) FROM efleet_copy WHERE EXTRACT(MONTH FROM service_date) = 02 AND mta_id LIKE '_________'
GROUP BY mta_id HAVING COUNT(mta_id) > 1) AS e2
ON e1.mta_id = e2.mta_id
WHERE EXTRACT(MONTH FROM service_date) = 02
ORDER BY e1.mta_id ASC, e1.ride_id ASC, e1.trip_number ASC
)
SELECT * FROM cte0 c
WHERE NOT EXISTS (
SELECT 1 FROM cte0 ci
WHERE c.ride_id = ci.ride_id
AND status = 'Approved'
GROUP BY ride_id
HAVING SUM(trip_total_amount) = 0::money
)
使用
DISTINCT
子句可以删除重复的行
尝试
选择DISTINCT
您可以尝试DISTINCT子句,因此您的查询如下所示:
SELECT DISTINCT
rate,
status,
ride_id,
trip_number,
mta_id,
service_date,
service_start,
driver_id,
cab_number,
trip_total_amount
FROM cte0 c
WHERE NOT EXISTS (
SELECT 1 FROM cte0 ci
WHERE c.ride_id = ci.ride_id
AND status = 'Approved'
GROUP BY ride_id
HAVING SUM(trip_total_amount) = 0::money
);
我认为你可以做到:
SELECT c.*
FROM cte0 c
WHERE NOT EXISTS (SELECT 1
FROM cte0 ci
WHERE c.ride_id = ci.ride_id AND
status = 'Approved'
GROUP BY ride_id
HAVING SUM(trip_total_amount) = 0::money
) OR
(c.status = 'Canceled' AND
EXISTS (SELECT 1
FROM cte0 ci
WHERE c.ride_id = ci.ride_id AND
ci.status = 'Canceled' AND
ci.trip_total_amount = - c.trip_total_amount
)
)
问题有点不清楚。我将使用窗口函数来处理所有逻辑,但您已经从
exists
子查询开始,因此遵循这种精神。消除两个或消除DUP(保留一个)?另外,如何知道它是否是dup?你能提供一份工作吗?(强迫人们处理你的数据是没有意义的,努力向所有未来的用户概括你的问题)当他们拥有完全相同的数据时,他们是重复的,除了旅行总金额。就像图片中突出显示的一样,两个交易都被取消了,所以我不需要在结果中使用它们,但我不想完全消除所有取消的交易,因为有时会有一些重复的交易被取消并批准。你能发布最简单的示例吗。列数最少,但足以推断您的场景的可能答案?每个人都有一个简单的语义,比如订单号
,订单状态
,…为您提到的@jpabiado场景提供样本数据和结果会有所帮助,但它们并不完全重复,它们是一些彼此不同的数据字段,例如在图像“trip_total_amount”try(regexp_replace(trip_total_amount)、\D”、“g”和“”):numeric AS result
中删除“trip_total_amount”中的非数字字符@jpabiado\D是“非数字”的类缩写。您需要第四个参数“g”(表示“全局”)来替换输入的所有OccursTank,但当我尝试此操作时,它会运行,但查询结果仍然显示这些参数transactions@jpabiado . . . “取消”的拼写正确吗?我正在使用的数据使用该词,这就是我在我的应用程序中使用该词的原因queries@jpabiado . . . 我最初的答案拼写不正确。我也尝试了这个方法,但它只是将所有取消的事务堆积在查询结果的较低部分。这有点帮助,但我需要更坚实的东西。不管怎样,谢谢。你是说把所有取消的交易都堆在下面的部分?你想要的记录在那里吗?如果问题与记录的放置位置有关,则可以使用ORDER BY。