2016-10-06 3 views
0

エンジニアが何らかのデータを与えられていて、データを集計して1行に収まらない場合は少ない行に収めることができるのかどうか疑問に思っています。いくつかのデータへのgithubのリンクが以下に示されています。わかるように、冗長性とヌル値がいっぱいです。私は単純なグループ化を試みましたが、それはうまくいきませんでした。私は今、各ビューが列を追加する複数のビューを作成しています。作成した各ビューでは、各列がNULLではないことを示しているため、NULL行を減らすことができます。しかし、私はまだ冗長なサンプルIDを取得しており、カラムの値はその冗長性のためにはならない場所です。ビューの1つとして私がやっていることは次のとおりです。サンプルIDは私がキーにもっとも近いものです。私はsampleIDがキーになるようにデータを十分に分解することができることを期待していましたが、それは実際には機能しません。テーブルの長さは7500行を超えています。データをSQLでグルーピングする

GitHubに投稿したデータのサンプルを示します。データの一番下までスクロールすると、水平スクロールバーが表示されます。ここで

https://github.com/thomasawolff/verification_text_data/blob/master/Lydia%20query%20deicers%2020161005_sample.csv

+0

あなたは別名とグループの両方を使用しています。あなたがする必要があるようなサウンドは、別のものを失うことです。s.smpl_idカラムを除いて、グループからs.smpl_idカラムをすべて削除し、s.smpl_idを除くすべてのカラムの周りに 'MAX()'を追加します。列に存在する値。これらの結果は、11g以前のスタイルのピボットクエリの半分点に非常によく似ています(これは、列が集約関数を1つの行に崩壊させる場所を意味します)。 – Boneist

+0

それで、MAX()は各列が非常に多く存在することができると述べていますか? –

+0

'MAX()'は単にグループ全体でその列内の最大値を返します。列に複数の値がある場合、特定のsmpl_idに対してその列に何を表示したいですか? – Boneist

答えて

0

私はこの問題を解決するために使用してしまったクエリがあります。すべての列に対してmax()を使用するとうまくいきました。次に、1つの列に2つ以上の値エントリを持つテストIDを減算し、残っていたものは正しいものでした。私はmax()を使うのは数値ではない値のどれかを使ったとは思わなかった。これらの値は空のセルよりも価値があるため、おそらく機能しました。

しかし、私はのようなものを使用している可能性:

select max(to_number(regexp_substr()) 

と私は念のために、これが再び行われる必要があることを行うことができます。これらのテストIDのmax()出力を乱してしまったので、重複したエントリを削除することに集中する必要がありました。

---*** Takes the max or the value of the only entry in a column 
create or replace view maxdataset as 
select t.smpl_id, 
t.matl_cd,t.geog_area_t, 
max(t.assay) as assay, 
max(t.effectiveness_pns_score_) as effectiveness_pns_score, 
max(t.pns_blank) as pns_blank, 
max(t.pns_nacl) as pns_nacl, 
max(t.settable_solids) as settable_solids, 
max(t.perc_pass_10m) as perc_pass_10m, 
max(t.ph) as ph, 
max(t.as_) as as_, 
max(t.ba) as ba, 
max(t.cd) as cd, 
max(t.cr) as cr, 
max(t.cu) as cu, 
max(t.pb) as pb, 
max(t.hg) as hg, 
max(t.se) as se, 
max(t.zn) as zn, 
max(t.cn) as cn, 
max(t.p) as p, 
max(t.s) as s, 
max(t.sulfate) as sulfate, 
max(t.phosphate) as phosphate, 
max(t.k) as k, 
max(t.ca) as ca, 
min(t.mg) as mg, 
max(t.nitrite) as nitrite, 
max(t.nitrate) as nitrate, 
max(t.chloride) as chloride 
from leslietable t 
group by t.smpl_id,t.matl_cd,t.geog_area_t 
; 
---*** Removes just test ID rows with columns having more than one entry per test ID 
create or replace view doubleEffect_short as 
select t.smpl_id 
from LESLIETABLE t inner join LESLIETABLE s 
on t.smpl_id = s.smpl_id where 
(t.effectiveness_pns_score_ <> s.effectiveness_pns_score_) or 
(t.pns_blank <> s.pns_blank) or (t.pns_nacl <> s.pns_nacl) or 
(t.settable_solids <> s.settable_solids) or 
(t.perc_pass_10m <> s.perc_pass_10m) or 
(t.ph <> s.ph) or (t.as_ <> s.as_) or 
(t.as_ <> s.as_) or (t.ba <> s.ba) or 
(t.cd <> s.cd) or (t.cr <> s.cr) or 
(t.cu <> s.cu) or (t.pb <> s.pb) or 
(t.hg <> s.hg) or (t.se <> s.se) or 
(t.zn <> s.zn) or (t.cn <> s.cn) or 
(t.p <> s.p) or (t.sulfate <> s.sulfate) or 
(t.phosphate <> s.phosphate) or 
(t.k <> s.k) or (t.ca <> s.ca) or 
(t.mg <> s.mg) or (t.nitrite <> s.nitrite) or 
(t.nitrate <> s.nitrate) or (t.chloride <> s.chloride) 
group by t.smpl_id 
order by t.smpl_id 
; 
---*** Outputs all columns from max data set having more than one value per column 
create or replace view final_data_sifter as 
select t.smpl_id,t.matl_cd,t.geog_area_t,t.assay,t.effectiveness_pns_score, 
t.pns_blank,t.pns_nacl,t.settable_solids,t.perc_pass_10m,t.ph,t.as_,t.ba,t.cd, 
t.cr,t.cu,t.pb,t.hg,t.se,t.zn,t.cn,t.p,t.s,t.sulfate,t.phosphate,t.k,t.ca,t.mg, 
t.nitrite,t.nitrate,t.chloride 
from maxdataset t join doubleeffect_short s 
on t.smpl_id = s.smpl_id 
; 
---*** Sutracts rows with multiple values per column from max data set 
create or replace view finalDataset_incomplete as 
select * from maxdataset t 
minus 
select * from final_data_sifter 
関連する問題