私はオンラインシューティングゲームのゲーム統計を追跡するサービスを作成しています。クライアントはイベントをサーバーに報告し、SQL Serverデータベースに記録します。サーバーは、クライアントレポートから集計されたゲームイベントのレポートを生成することが期待されています。イベントクレームの真正性は、レポートしたクライアントの数に基づいています。LinqからSQLへのサブクエリから重複行セットを除外する
私は、発生した時間(7秒以内)に基づいて異なるクライアントからのイベントレポートをグループ化するLinq-to-SQLクエリを持っています。
Events
.Select(e =>
Events.Where(ev =>
// Same event type
ev.Discriminator == e.Discriminator &&
// Same match
ev.ServerIpAddress == e.ServerIpAddress &&
SqlMethods.DateDiffSecond(ev.MatchStartTime, e.MatchStartTime) < 30 &&
// Find nearby events
Math.Abs(ev.MatchTime.TotalSeconds - e.MatchTime.TotalSeconds) < 7 &&
// That are duplicate
ev.VictimTribesGuid == e.VictimTribesGuid &&
ev.KillerTribesGuid == e.KillerTribesGuid &&
ev.KillType == e.KillType &&
ev.Weapon == e.Weapon
)
)
これは、以下を返す:
イベントは(最初の2行を参照)予想されるようにグループ化されたが、外側のクエリが「当たりイベント」であるように、グループが複製されています。
これらの重複グループを削除する方法はありますか?
まず、すべてのイベントが自分自身を選択します。しかし、「Math.Abs」のために、マッチAがマッチBの7秒以内であれば、AとBの両方にAとBが含まれます。 –
はい - 余分な「A + B」の結果(およびA + B + C + ...より多くの行の場合) –
'Math.Abs'を削除して(そして0〜7秒の間で指定すると)、近くの複数の対応するイベント私はまた、 '孤独な'イベントをクエリに含めたいと思っています。 –