丢失具有不同的订单行 - PostgreSQL
Losing order rows with distinct - PostgreSQL
我正在使用 SQL
,我想 select 使用 numero_engin if exist else numero_train
结果。所以我正在使用 coalesce
来做到这一点。为了移除重复的行,我尝试使用 distinct
。但是使用 distinct
时出现问题,我失去了行的顺序。
这是我的要求:
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC) AS req
ORDER BY req.cle,req.utc_horodatage_observation DESC
此请求 return 以重复行排序的结果:
SELECT COALESCE(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC
但是添加distinct
时的全局请求,显示乱序
您需要重新排列
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC) AS req
ORDER BY req.cle,req.utc_horodatage_observation DESC
到
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
) AS req
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC
请注意,我删除了额外的 ORDER BY
编辑: 我注意到您在 select 不同的地方使用了 *,因此您可能得不到预期的结果。我看不到您的 table 设计 - 但请考虑以下示例:
Table 1:
numero_engin | numero_train | something1 | something2
-----------------------------------------------------
engin1 | NULL | something | something
engin1 | numero1 | something1 | something2
NULL | numero1 | something3 | something4
然后您需要一个带有合并的附加列,然后您会得到:
numero_engin | numero_train | something1 | something2 | coalesce_column
------------------------------------------------------------------------
engin1 | NULL | something | something | engin1
engin1 | numero1 | something1 | something2 | engin1
NULL | numero1 | something3 | something4 | numero1
到目前为止一切顺利 - 但现在你想要与 coalesce_column 不同的值 - 但是因为你使用 *,所以你实际上说你想要不同的 行.
所以做 SELECT DISTINCT coalesce_column FROM TABLE
会得到你想要的;但是做 SELECT DISTINCT coalesce_column, * FROM TABLE
会让你高于 table,因为每一行 IS 不同。
我正在使用 SQL
,我想 select 使用 numero_engin if exist else numero_train
结果。所以我正在使用 coalesce
来做到这一点。为了移除重复的行,我尝试使用 distinct
。但是使用 distinct
时出现问题,我失去了行的顺序。
这是我的要求:
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC) AS req
ORDER BY req.cle,req.utc_horodatage_observation DESC
此请求 return 以重复行排序的结果:
SELECT COALESCE(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC
但是添加distinct
时的全局请求,显示乱序
您需要重新排列
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC) AS req
ORDER BY req.cle,req.utc_horodatage_observation DESC
到
SELECT DISTINCT on (req.cle) req.cle,*
FROM (SELECT coalesce(p.numero_engin, p.numero_train) AS cle, *
FROM last_position p
WHERE 1=1
AND p.source_localisation LIKE 'B%'
) AS req
ORDER BY p.numero_engin, p.utc_horodatage_observation DESC
请注意,我删除了额外的 ORDER BY
编辑: 我注意到您在 select 不同的地方使用了 *,因此您可能得不到预期的结果。我看不到您的 table 设计 - 但请考虑以下示例:
Table 1:
numero_engin | numero_train | something1 | something2
-----------------------------------------------------
engin1 | NULL | something | something
engin1 | numero1 | something1 | something2
NULL | numero1 | something3 | something4
然后您需要一个带有合并的附加列,然后您会得到:
numero_engin | numero_train | something1 | something2 | coalesce_column
------------------------------------------------------------------------
engin1 | NULL | something | something | engin1
engin1 | numero1 | something1 | something2 | engin1
NULL | numero1 | something3 | something4 | numero1
到目前为止一切顺利 - 但现在你想要与 coalesce_column 不同的值 - 但是因为你使用 *,所以你实际上说你想要不同的 行.
所以做 SELECT DISTINCT coalesce_column FROM TABLE
会得到你想要的;但是做 SELECT DISTINCT coalesce_column, * FROM TABLE
会让你高于 table,因为每一行 IS 不同。