丢失具有不同的订单行 - 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 不同。