计数条目,汇集列并返回布尔值

时间:2013-11-19 09:48:23

标签: sql postgresql case distinct

(随意修改标题)

嗨,我在MacOSX上使用Postgres 9.3。我对任何一种SQL都不熟悉。我正在尝试创建一个查询函数(下面的代码和示例),它通过使用individuals汇集某些列来计算不同的条目(SELECT DISTINCT ON)。这很好用。当我在同一个函数中添加CASE语句来检查另一列的每一行是否返回NULL时,问题就出现了。

所以,我有一个看起来像这样但有数千个条目的表。 Here is a subset您可以在其中查看特定物种和方法的数据。地理数据具有不同的分辨率,但在这里我汇集了species, method, location, larger_region列(例如,汇集method是多余的)请参阅下面的代码和输出。

--CODE
CREATE TABLE test_tbl (accn varchar(10) PRIMARY KEY, method TEXT, species VARCHAR(30), lat NUMERIC,       
lon NUMERIC, location TEXT, larger_region TEXT, coords BOOLEAN DEFAULT TRUE);

FETCH FORWARD 1 FROM test_tbl;

accn     |  method  |        species    |   lat    |    lon   |         location           | larger_region | coords 
---------+----------+-------------------+----------+----------+----------------------------+---------------+---------
EU336944 |  Isolate | Dysidea granulosa | 10.07704 | 73.63238 | Lakshadweep Islands, India | Indian EEZ    | t

CREATE TABLE test_view_tbl ( species VARCHAR(30) NOT NULL, no_ind BIGINT NOT NULL, method TEXT NOT NULL, location TEXT NOT  
NULL, larger_region TEXT NOT NULL );

下面的函数会产生正确的输出。

CREATE FUNCTION test_view() RETURNS SETOF test_view_tbl AS $$
SELECT DISTINCT ON (species, method, location, larger_region) species, count(species), method, location, larger_region
FROM test_tbl
GROUP BY species, method, location, larger_region
ORDER BY species;
$$ LANGUAGE sql

SELECT * FROM test_view();

       species      | no_ind | method  |               location               | larger_region 
  ------------------+--------+---------+--------------------------------------+---------------
  Dysidea granulosa |      6 | Isolate | Kavaratti Island, Lakshadweep, India | Indian EEZ
  Dysidea granulosa |     13 | Isolate | Lakshadweep Islands, India           | Indian EEZ

下面我通过添加test_view_tblboolean来修改coords并相应地修改代码。这将检查列lat是否为NULL,即每个条目是否都有坐标。然而,这也通过不返回某些条目来搞砸上述想要的结果。

ALTER TABLE test_view_tbl ADD COLUMN coords BOOLEAN DEFAULT TRUE;

CREATE FUNCTION test_view() RETURNS SETOF test_view_tbl AS $$
SELECT DISTINCT ON (species, method, location, larger_region) species, count(species), method, location, larger_region,
CASE WHEN lat IS NULL THEN coords IS FALSE ELSE TRUE
END
FROM test_tbl 
GROUP BY species, method, location, larger_region, lat, coords
ORDER BY species;
$$ LANGUAGE sql

SELECT * FROM test_view();

      species      | no_ind | method  |               location               | larger_region | coords 
-------------------+--------+---------+--------------------------------------+---------------+--------
 Dysidea granulosa |      6 | Isolate | Kavaratti Island, Lakshadweep, India | Indian EEZ    | t
 Dysidea granulosa |      3 | Isolate | Lakshadweep Islands, India           | Indian EEZ    | t

因此,代码的每个部分都可以工作,但显然不在一起,因为它会在10个条目上返回NULL。它似乎只计算lat location中的每个不同坐标(Lakshadweep Islands, India)我试图修复它但没有成功。我希望有一些指示,谢谢

0 个答案:

没有答案