2

列のサブセットを選択したいテーブルがありますが、キュー内の場所に基づいて計算列を最後に追加します。次のフィールドがあります (関連する)。

id: int、自動インクリメント、主キー answertime: datetime、nullable

デフォルトでは、何かがキューに送信されると、応答時間は NULL になります。そのため、キュー内のモノの ID とキュー内のランクを選択したいと考えています (つまり、ランク 1 は未回答の次のアイテムなどです)。これが私が考えていたことです:

ランク - id - COUNT (応答時間が null ではない、自分の id より下の id)。ただし、このクエリの構文に問題があります。

SELECT id AS outerid, COUNT(
    SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL
)
FROM tablename 
WHERE answertime IS NULL;

明らかに、これは間違っています。なぜなら、集約関数内に選択を埋め込むことはできないと確信しているためです。同様に、コードのその時点で SELECT を埋め込むことができないため、SELECT と COUNT を反転しても機能しません。 (WHERE 句でのみ使用できます)。

これはSQLだけでも可能ですか、それともプログラムの最後にロジックを追加する必要がありますか?

それが役立つ場合は、SQL Server 2008 でこれを行っていますが、それが価値をもたらすとは思えません。

4

3 に答える 3

3

それはできますSELECT *が、集計サブクエリでは使用できません。COUNTスカラー結果として値を取得する、これを試してください。

SELECT
   id AS outerid,
   (SELECT COUNT(Id) FROM tablename
    WHERE id<outie.id AND answertime IS NOT NULL)
FROM tablename outie
WHERE answertime IS NULL;

本当に求めているものに応じて、 を使用するか、他の列COUNT(*)を使用するかを自分で選択する必要がある場合があります。COUNT(Id)

于 2012-01-20T19:26:05.620 に答える
0

@HLGEM で提案されているようROW_NUMBER()に、結果を取得するために使用できます。この方法では、パーティショニングなしでtablenamebyで行をランク付けし、 byでパーティショニング使用して行をランク付けします。NULLであるすべての行のランキングの差は、サブクエリで使用して計算している値と同じ値になります。ididanswertimeanswertimeCOUNT()

メソッドの実装は次のとおりです。

;
WITH ranked AS (
  SELECT
    *,
    Rnk     = ROW_NUMBER() OVER (                        ORDER BY id),
    PartRnk = ROW_NUMBER() OVER (PARTITION BY answertime ORDER BY id)
  FROM tablename
)
SELECT
  id,  /* AS outerid, if you like */
  Cnt = Rnk - PartRnk
FROM ranked
WHERE answertime IS NULL
于 2012-01-20T21:54:57.880 に答える