1

私は、私が理解できないSELECTステートメントを持っています。クエリは次のとおりです。

SELECT 
  count(1),
  interaction_type_id 
FROM
  tibrptsassure.d_interaction_sub_type
GROUP BY 
  interaction_type_id
HAVING 
  count(interaction_type_id) > 1 
ORDER BY
 count(interaction_type_id) DESC 
LIMIT 5;

私のアプリケーションは LIMIT キーワードの使用をサポートしていないため、rank()次のように関数を使用してクエリを変更してみました。

SELECT
 interaction_type_id, 
 rank() OVER (PARTITION BY interaction_type_id ORDER BY count(interaction_type_id)
 DESC) 
FROM 
 tibrptsassure.d_interaction_sub_type;

ただし、この方法では、次のエラーメッセージが表示されました。

ERROR:  column "d_interaction_sub_type.interaction_type_id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT  interaction_type_id, rank() OVER (PARTITION BY inter...    
                    ^
    ********** Error **********

ERROR: column "d_interaction_sub_type.interaction_type_id" must appear in the GROUP BY clause or be used in an aggregate function
SQL state: 42803
Character: 9

rownum()PostgreSQLに相当するものはありますか? (つまり、LIMIT キーワードを使用して同じ結果を得ることは別として。)

誰か私に提案はありますか?前もって感謝します。

4

2 に答える 2

1

問題はクエリにありました。つまり、構文エラーがありました。必要だったのは、 in each の上位 5category_idおよび上位 5 インスタンスと、type_idin eachcategory_idの上位 5 インスタンスでしsub_type_idtype_id。これを実現するために、クエリを次のように変更し、最終的に期待される出力を得ました。

SELECT * FROM (
SELECT t1.int_subtype_key, t2.interaction_sub_type_desc, interaction_category_id, 
interaction_type_id, interaction_sub_type_id, count(interaction_sub_type_id) AS
subtype_cnt,
rank()
over (PARTITION BY interaction_category_id, interaction_type_id ORDER BY 
count(interaction_sub_type_id) DESC) AS rank
FROM tibrptsassure.f_cc_call_analysis t1 INNER JOIN
tibrptsassure.d_interaction_sub_type t2 ON t1.int_cat_key = t2.intr_catg_ref_nbr 
AND t1.int_subtype_key = t2.intr_sub_type_ref_nbr INNER JOIN 
tibrptsassure.d_calendar t3 ON t1.interaction_date = t3.calendar_date GROUP BY
t2.interaction_sub_type_desc, t1.int_subtype_key, interaction_category_id, 
interaction_type_id, interaction_sub_type_id) AS sub_type
WHERE rank <= 5;

これに注意を払い、私を助けてくれたみんなに感謝します。

于 2013-05-30T06:29:47.940 に答える
1

以下が機能するかどうかをテストします (これは標準の postgresql 構文であり、機能するはずです)。

with 
t as (
   select 1 as id union all 
   select 1 as id union all    
   select 2 union all 
   select 2 union all    
   select 3) 

select 
   id
from
   t
group by
   id
having 
   count(id) > 1
order by 
   id desc
limit 1 

これが機能する場合は、構文に問題があります。これが機能しない場合は、別の問題があります。おそらく、使用しているソフトウェアが非常に奇妙な方法で制限されている可能性があります。

も使用できますがrow_number()、あまり効率的な方法ではありません。

with 
t as (
   select 1 as id union all 
   select 1 as id union all    
   select 2 union all 
   select 2 union all    
   select 3) 

, u as (
   select 
      id,
      count(*)
   from
      t
   group by
      id
   )

, v as (
   select
      *,
      row_number() over(order by id) c
   from
      u
   )

select
   *
from
   v
where
   c < 2
于 2013-05-29T12:21:31.317 に答える