如何使用GROUP BY子句消除重复字段?

时间:2015-05-07 03:39:15

标签: postgresql

我有3个名为:

的表
1.app_tenant pk:id, fk:pasar_id
 ---+--------+-----------+
 id | nama   | pasar_id  |
----+--------+-----------+
  1 | joe    |         1 | 
  2 | adi    |         2 | 
  3 | adam   |         3 |

2.app_pasar pk:id
----+------------- +
 id | nama         |
----+------------- +
  1 | kosambi      | 
  2 | gede bage    |  
  3 | pasar minggu |   


 3.app_kios pk:id, fk:tenant_id
----+---------------+----------
 id | nama          |tenant_id
----+-------------- +----------
 1  | kios1         |1
 2  | kios2         |2
 3  | kios3         |3
 4  | kios4         |1
 5  | kios5         |1
 6  | kios6         |2
 7  | kios7         |2
 8  | kios8         |3
 9  | kios9         |3

然后在每个表中使用LEFT JOIN查询并按id分组,我想显示如下数据:

----+---------------+------------+-----------
 id | nama_tenant   |nama_pasar  |nama_kios
----+-------------- +------------------------
  1 | joe           |kosambi     |kios 1
  2 | adi           |gede bage   |kios 2
  2 | adam          |pasar minggu|kios 3

但在执行此查询后,数据未按预期显示。问题是 nama_tenant字段中的冗余。如何消除重复的nama_tenant记录?

这是我的疑问:

select a.id,a.nama as nama_tenant,
       b.nama as nama_pasar,
       c.nama as nama_kios
from app_tenant a 
left join app_pasar b on a.id=b.id
left join app_kios c on a.id= c.tenant_id
group by 
      a.id,
      b.id,
      c.id 

表定义:

CREATE TABLE app_tenant (
  id serial PRIMARY KEY,
  nama character varying,
  pasar_id integer);

CREATE TABLE app_kios (
  id serial PRIMARY KEY,
  nama character varying,
  tenant_id integer REFERENCES app_tenant);

1 个答案:

答案 0 :(得分:0)

问题是租户可以拥有多个信息亭。从您的示例数据看起来您想显示每个租户的第一个信息亭(尽管“第一个”是字符串上的模糊概念,这里我使用按字母顺序排序)。您的查询将是这样的:

va_list ap;
va_start(ap, otherButtonTitles);

// Replace your XXXX with ap

va_end(ap);

SELECT t.id, t.nama AS nama_tenant, p.nama AS nama_pasar, k.nama AS nama_kios FROM app_tenant t LEFT JOIN app_pasar p ON p.id = t.pasar_id LEFT JOIN ( SELECT tenant_id, nama, rank() OVER (PARTITION BY tenant_id ORDER BY nama) AS rnk FROM app_kios WHERE rnk = 1) k ON k.tenant_id = t.id ORDER BY t.id 上的子查询使用window function在为每个租户排序信息亭名称后获取第一个信息亭名称。

我还建议对表名使用有意义的别名,而不是简单地使用a,b,c。