如何在postgresql中按工作顺序选择不同?

时间:2018-12-23 18:30:11

标签: sql postgresql

Tablex:

| ID |  SITE| TIME  | TYPE|
|----|------|-------|-----|
| aa | 100  | 12-18 | fo  |
| aa | 101  | 12-10 | ba  |
| bb | 102  | 12-10 | fo  |
| cc | 100  | 12-09 | ba  |
| cc | 109  | 12-01 | fo  |
| dd | 100  | 12-08 | fo  |

fo等于2,ba等于1。
我想按类型排序并将其插入到另一个表中。

INSERT INTO "NUtable"
SELECT DISTINCT ON("ID")
*
FROM
TABLEX
ORDER BY
"ID","SITE","TIME",(CASE "TYPE" WHEN 'fo' then 2
WHEN 'ba' then 1
ELSE NULL END
) DESC

SQL似乎工作正常。 但是,结果在某些行中出错。 为什么这样?

以下是cc错误结果的示例: http://sqlfiddle.com/#!17/0c0e4/2

结果应该是

+----+------+-------+------+
| ID | SITE | TIME  | TYPE |
+----+------+-------+------+
| aa |  100 | 12-18 | fo   |
| bb |  102 | 12-10 | fo   |
| cc |  109 | 12-01 | fo   |
| dd |  100 | 12-08 | fo   |
+----+------+-------+------+

代替

+----+------+-------+------+
| ID | SITE | TIME  | TYPE |
+----+------+-------+------+
| aa |  100 | 12-18 | fo   |
| bb |  102 | 12-10 | fo   |
| cc |  100 | 12-09 | ba   |
| dd |  100 | 12-08 | fo   |
+----+------+-------+------+

2 个答案:

答案 0 :(得分:1)

您需要按 second 键的类型进行订购:

SELECT DISTINCT ON ("ID") x.*
FROM TABLEX x
ORDER BY "ID",
         (CASE "TYPE" WHEN 'fo' THEN 2 WHEN 'ba' then 1
               ELSE NULL
          END) DESC,
         "SITE", "TIME";

DISTINCT ON占据每个"ID"遇到的第一行。您希望该行具有特定类型,因此该类型的逻辑应为ORDER BY的一部分。

答案 1 :(得分:0)

行的排序优先于ORDER BY之后给出的列的顺序,因此在您的示例中,由于您的订单是id,site,...,所以按预期工作

如果要获得预期的结果,则需要将类型移至第二位

ORDER BY id, (CASE “TYPE”...

您还应该在箱子内部进行切换,以使“ fo”为1而“ ba”为2