2 番目に多くの異なる値を持つ属性 R:a を返すクエリがあるとします (テーブル名と属性名を返します)。私の仕事は次のとおりです。
同じ属性 R:a の個別の値ごとに、個別の値を val として返し、この値を持つ R 内のタプルの数を count として返します。R タプルの 20% の R:a 値が等しいかそれより低く、R タプルの 20% がそれより高いか等しい R:a 値を持つような、これらの異なる値の結果を表示します。
クエリができるだけ効率的に実行されるように、ストレージの変更を提案します。
個別の値とカウントを返すクエリを作成しましたが、結果の 20% を表示するにはどうすればよいでしょうか?また、このコンテキストでのストレージの変更は何を意味するのでしょうか?
SELECT pg_stats.tablename,pg_stats.attname,UNNEST(pg_stats.most_common_vals::text::varchar[]) as val, UNNEST(pg_stats.most_common_freqs)*pg_class.reltuples as count
FROM information_schema.columns,pg_stats,pg_class,
( SELECT T.tablename,T.attname
FROM (
SELECT pg_stats.tablename, pg_stats.attname, pg_stats.n_distinct as distval
FROM information_schema.columns,pg_stats
WHERE pg_stats.tablename = table_name AND pg_stats.attname = column_name AND (NOT (information_schema.columns.table_schema LIKE 'pg_%' OR information_schema.columns.table_schema = 'information_schema')) AND (information_schema.columns.data_type ='character varying') AND (table_name NOT in (SELECT viewname FROM pg_views))
LIMIT 5) as T
ORDER by T.distval DESC limit 1 offset 1) as temp
WHERE (pg_stats.tablename = table_name AND pg_stats.attname = column_name AND (NOT
(information_schema.columns.table_schema LIKE 'pg_%' OR
information_schema.columns.table_schema
= 'information_schema')) AND (information_schema.columns.data_type ='character varying') AND
(table_name NOT in (SELECT viewname FROM pg_views))
AND pg_stats.tablename = relname AND temp.tablename = pg_stats.tablename AND temp.attname =
pg_stats.attname);