1

以下のクエリの結果を取得しようとしています。

select distinct
       REQ_ID
     , ID
     , MAX(STEP) as step
     , SUBSTRING(p1.NAME,9, len(p1.NAME)) as _index_
     , p2.value as location

from HISTORY h

LEFT JOIN Parameter p1 
on     p1.WP_ID=h.ID
   AND (   (    p1.NAME like 'name_' 
            AND p1.VALUE like h.ID COLLATE DATABASE_DEFAULT ) 
        OR (    p1.NAME like 'name__' 
            AND p1.VALUE like h.ID COLLATE DATABASE_DEFAULT) )

LEFT JOIN Parameter p2 
on     p2.WP_ID=h.ID 
   AND p2.PA_NAME = 'Location' + (SUBSTRING(p1.NAME,9, len(p1.NAME)) ) 

WHERE h.ROLE = 'rock'

GROUP BY REQ_ID, ID, step, p1.name, p2.value

問題は、クエリが複数の結果(私の場合は6つ)をMAX(STEP)返し、値が最大値を返さないことです。0,1,3,0,1,2のような値を見ることができます。max(step)?で結果のみを取得します stepフィールドはvarchar(1)

4

3 に答える 3

0

最高のステップを持つレコードを1つだけ取得するには、次を使用します。

SELECT TOP(1)
......
......
ORDER BY step desc
于 2012-11-23T13:59:52.030 に答える
0

この方法を試してください(group byからステップを削除してください):

select REQ_ID,ID,MAX(STEP) as step,SUBSTRING(p1.NAME,9, len(p1.NAME)) as _index_,
p2.value as location
from HISTORY h
LEFT JOIN Parameter p1 on p1.WP_ID  =h.ID  AND 
( (p1.NAME like 'name_' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT ) 
OR (p1.NAME like 'name__' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT) )
LEFT JOIN Parameter p2 on p2.WP_ID=h.ID AND p2.PA_NAME = 'Location' + (SUBSTRING(p1.NAME,9, len(p1.NAME)) ) 
WHERE h.ROLE = 'rock'
GROUP BY REQ_ID,ID, p1.name, p2.value

また

削除stepしてgroupbyに追加SUBSTRING(p1.NAME,9, len(p1.NAME))します。

select REQ_ID,ID,MAX(STEP) as step,SUBSTRING(p1.NAME,9, len(p1.NAME)) as _index_,
p2.value as location
from HISTORY h
LEFT JOIN Parameter p1 on p1.WP_ID  =h.ID  AND 
( (p1.NAME like 'name_' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT ) 
OR (p1.NAME like 'name__' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT) )
LEFT JOIN Parameter p2 on p2.WP_ID=h.ID AND p2.PA_NAME = 'Location' + (SUBSTRING(p1.NAME,9, len(p1.NAME)) ) 
WHERE h.ROLE = 'rock'
GROUP BY REQ_ID,ID, SUBSTRING(p1.NAME,9, len(p1.NAME)),p2.value
于 2012-11-23T14:03:36.083 に答える
0

を扱う場合first record in a group、最も簡単なアプローチはを使用することROW_NUMBER()です。スキーマとデータについて詳しく知らなくても、次のクエリは機能すると言えますが、さらに単純化できる可能性があります...

WITH
  sequenced_data AS
(
  SELECT
    REQ_ID,
    ID,
    ROW_NUMBER() OVER (PARTITION BY req_id, id ORDER BY step DESC) AS sequence_id,
    STEP,
    SUBSTRING(p1.NAME,9, len(p1.NAME)) as _index_,
    p2.value as location
  FROM
    HISTORY    h
  LEFT JOIN
    Parameter  p1
      ON  p1.WP_ID = h.ID
      AND (   (p1.NAME like 'name_' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT ) 
           OR (p1.NAME like 'name__' AND p1.VALUE  like h.ID COLLATE DATABASE_DEFAULT)
          )
  LEFT JOIN
    Parameter  p2
      ON  p2.WP_ID = h.ID
      AND p2.PA_NAME = 'Location' + (SUBSTRING(p1.NAME,9, len(p1.NAME)) ) 
  WHERE
    h.ROLE = 'rock'
  GROUP BY
    REQ_ID,
    ID,
    STEP,
    SUBSTRING(p1.NAME,9, len(p1.NAME)),
    p2.value
)
SELECT
  *
FROM
  sequenced_data
WHERE
  sequence_id = 1

これにより、組み合わせごとに1つの行のみが提供さreq_id, idれ、常に最も高いstep値の行が選択されます。

注:GROUP BYまだ必要かどうかはわかりません。あなたがそれを持っていたという理由だけで私はそれを残しました。

于 2012-11-23T14:13:27.507 に答える