-1

我正在使用SQL,我想选择结果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

此请求返回按重复行排序的结果:

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,结果显示混乱。

4

1 回答 1

0

你需要重新排列

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 distinct 中使用 *,因此您可能无法得到您期望的结果。我看不到您的桌子设计 - 但请考虑以下示例:

表格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 中获得不同的值——但是因为你使用 *,所以你实际上说你想要不同的

所以做 aSELECT DISTINCT coalesce_column FROM TABLE会让你得到你想要的;但是做 aSELECT DISTINCT coalesce_column, * FROM TABLE会让你在桌子上,因为每一行都是不同的。

于 2017-08-10T07:54:10.337 回答