2

ここに、次のデータが入力されたテーブルがあるとします。

acc_id1  acc_id2  acc_grp_id1  acc_parameter1  acc_parameter2
111      111111   115          1               155
111      111111   116          2               166
222      222222   216          2               167
222      222222   217          2               168
333      333333   316          3               155
334      333333   317          3               169
444      444444   416          4               151
445      444444   417          2               166

すべてのアカウントには複数のacc_idがありますが、パラメーターコードは固定されています。このルールに従うアカウントのみを取得しようとしています。最大の(最新の)acc_grp_id1にparam1=2およびparam2=166がある場合、両方の行が存在する必要があります。最大の(最新の)パラメーターが異なるコードと等しい場合は、最新のパラメーターのみを入力します。

これはそれがどのように見えるべきかです:

acc_id1  acc_id2  acc_grp_id1  acc_parameter1  acc_parameter2
111      111111   115          1               155
111      111111   116          2               166
222      222222   217          2               168
334      333333   317          3               169
444      444444   416          4               151
445      444444   417          2               166

実際の出力は、5つのテーブルからの結合です。

任意のアイデアをいただければ幸いです。

4

3 に答える 3

2

このソリューションを試してください:

SELECT
    a.*
FROM
    tbl a
INNER JOIN
    (
        SELECT
            bb.*
        FROM
            (
                SELECT acc_id2, MAX(acc_grp_id1) AS maxgrpid
                FROM tbl
                GROUP BY acc_id2
            ) aa
        INNER JOIN
            tbl bb ON
                aa.acc_id2 = bb.acc_id2 AND
                aa.maxgrpid = bb.acc_grp_id1
    ) b ON 
        a.acc_id2 = b.acc_id2 AND
        (
            (b.acc_parameter1 = 2 AND b.acc_parameter2 = 166) OR 
            a.acc_grp_id1 = b.acc_grp_id1
        )
ORDER BY
    a.acc_id1,
    a.acc_id2,
    a.acc_grp_id1

SQLFiddleデモ

于 2012-07-05T23:18:12.010 に答える
1

これを試してください(テストされていません):

WITH FullData AS
(
    SELECT  a.*,
            ROW_NUMBER() OVER(PARTITION BY acc_id2 ORDER BY acc_grp_id1 DESC) AS Position
      FROM  <YOUR-TABLE> a
), FilteredData AS
(
    SELECT  *
      FROM  FullData
     WHERE  Position = 1 
       AND  acc_parameter_1 = 2 
       AND  acc_parameter_2 = 166
)
SELECT  a.*
  FROM  FullData a LEFT JOIN FilteredData b
        ON  a.acc_id2 = b.acc_id2
 WHERE  (b.acc_id2 IS NULL AND a.Position = 1) -- Should be a.Position instead of b.Position
    OR  b.acc_id2 IS NOT NULL
于 2012-07-05T22:59:19.580 に答える
0

これはうまくいくはずです:

SELECT AC.*
FROM (
  SELECT T.acc_id1,max(acc_grp_id1) maxacc_grp_id1
  FROM tbl T
  GROUP by t.acc_id1
) M
INNER JOIN tbl Last on Last.acc_id1=M.acc_id1 
  AND Last.acc_grp_id1=M.maxacc_grp_id1
INNER JOIN tbl AC on AC.acc_id1=M.acc_id1
  and ((Last.acc_parameter1 =2 and Last.acc_parameter2=166)
       OR ac.acc_grp_id1=M.maxacc_grp_id1)
于 2012-07-06T09:18:13.820 に答える