2016-07-29 3 views
0

残念なタイトルです。私は自分の問題をどのように記述するのか分かりませんでした。私は約23,000レコードを返すクエリを書いた。それらのレコードの多くは同様の情報を持っており、フィールドの最大値がdbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrengthのレコードのみを選択したいと考えています。私は選択されている他のすべての列でグループ化を試みましたが、正しく動作するようには見えません。私はSQL、特にmaxとgroupの機能を完全に理解していません。 1つのものだけを選択したい場合、単純なmax関数を実行できます。私は他のデータの束を選択したいときにどのように動作するのか分かりません。以下はクエリです。他のアイテムがたくさんある場合にMaxを選択

SELECT 
    dbo.tblmeterinfo.fldMeterSerialNumber AS "MOP_FNP_Meter", 
    dbo.tblMsgsOnAir_Type8.fldRBuddyId AS "MOP_FNP_FNID", 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    dbo.tblMsgsOnAir_Type8.fldCBuddyId AS "FNID_Helped", 
    dbo.fn_dt(dbo.tblMsgsOnAir_Type8.fldRBuddyToi) AS "TOI", 
    dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength AS "Sig_Str", 
    dbo.TBLSAWN_CIS_INFO.SML AS "Buddy_SML", 
    dbo.TBLMETERLIST.fldaddress AS "Buddy_Address", 
    dbo.TBLSAWNGISCOORD.X_COORD AS "X_Coord", 
    dbo.TBLSAWNGISCOORD.Y_COORD AS "Y_Coord" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERLIST 
    ON (dbo.TBLMETERLIST.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
LEFT OUTER JOIN dbo.TBLSAWN_CIS_INFO 
    ON (dbo.TBLSAWN_CIS_INFO.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLSAWNGISCOORD 
    ON (dbo.TBLSAWNGISCOORD.SRV_MAP_LOC = dbo.TBLSAWN_CIS_INFO.SML) 
LEFT OUTER JOIN dbo.tblmeterinfo 
    ON (dbo.tblmeterinfo.fldRepId = dbo.tblMsgsOnAir_Type8.fldRBuddyId) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 

以下のクエリは単純で、私がしたいことはしますが、他のフィールドはすべて取得しません。このクエリは、617個のレコードしか返しません。私は上記のクエリが617レコードを返すことを望みますが、私が選択した他のすべての情報を含みます。

SELECT 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    MAX(dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength) AS "Max_Sig" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 
GROUP BY dbo.TBLMETERMAINT.fldmeterid 

答えて

0

重複が発生している場合は、SELECT DISTINCTを試してみましたか?

基本的にMaxが動作する仕組みは、グループ内で最高の値を選択することです。だから、

あなたがテーブルを持っている場合:

ID  | VALUE 
1  | 10 
1  | 7 
1  | 9 
2  | 6 
2  | 8 

、あなたがごとの最大値を取得しますID

BY TABLE グループから

SELECT ID、MAX(VALUE) を行いますID

ID | VALUE 
1  | 10 
2  | 8 

Max whileそして、あなたが結合テーブル FROM副選択に

SELECT ID、VALUE、MAX_VALUEなどなど をグループを行うことができ、結果をグループ化していない(IDを選択して、MAX TABLE GROUP BY ID FROM MAX_VALUE AS(VALUE))MAX ON MAXなど.ID = TABLE.ID

+1

ありがとうございます。私は月曜日にクエリを修正して報告してみます。私はこれが理にかなっていると思う。 – AdamH

0

あなたのテーブル構造を詳細に把握していないと、これが最良の方法だとは確信できませんが、ここではうまくいくはずです。 2番目のクエリを左結合の左側に使用して、余分な列を取得します。

select a.* 
    from (<your 2nd query>) a 
left join dbo.TBLMETERLIST 
    on (a.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
left join <next table> ... 

などとなります。また、そのテーブルの列を取得するためには、dbo.tblMsgsOnAir_Type8に参加する必要があります。そのため、最初のクエリを超える追加の左結合が1つあります。ちなみに、ここにコードを投稿して読みやすいように投稿するのは良い考えです。他の人が理解しやすくなります。

+0

醜い投稿をして申し訳ありません。私は、コードの書式設定でクエリをラップする方法を見つけようとしましたが、そのオプションが表示されませんでした。投稿する前に投稿をプレビューするオプションがありませんでした。将来どのようにクエリを書式設定するのですか? – AdamH

+0

各行に4つのスペースを付けることができます。あなたが質問を入力するときは、あなたの質問が下に表示されますので、あなたが正しいことをしたかどうかを知ることができます。 –

1

おそらくrow_number()をレスキューする。一部のサブセットまたはその他のグループ化を使用して、セット内の最良のレコードを見つけることができます。何かのように

select * 
from .... 
where row_number over (partition by id order by fldBuddyLinkSigStrength) = 1 

したがって、SQL Serverはグループ内で行番号を割り当てます。各レコードはIDでサブグループ化されます(この場合は最高の強度の場合は1、次の場合は2)。

関連する問題