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 回答