1

私の質問への訂正....

単一のテーブルからクエリを選択して並べ替えようとしています。テーブルの主キーは、シリアル番号と時刻/日付スタンプの組み合わせです。

データベース内のテーブルの名前は「A12」で、列は次のように定義されています。

Serial2D (PK, char(25), not null)
Completed (PK, datetime, not null)
Result (smallint, null)
MachineID (FK, smallint, null)
PT_1 (float, null)
PT_2 (float, null)
PT_3 (float, null)
PT_4 (float, null)

テーブルの主キーは「Serial2D」と「Completed」の組み合わせであるため、「Completed」列と「Result」列に異なる値を持つ複数の「Serial2D」エントリが存在する可能性があります。(私はこのデータベースを作成しませんでした...私は私が得たもので作業しなければなりません)

「結果」列の値 (常に「0」または「1」) を利用し、「Serial2D」値ごとに一意の行のみを取得するクエリを作成したいと考えています。「結果」列にその行の「1」がある場合、結果列に「0」があるシリアルのエントリよりも選択したいと思います。Serial2D 値の Result 列エントリが「1」であるエントリは、テーブル内に 1 つだけ存在する必要があります。

元。テーブル

   Serial2d  Completed  Result   PT_1   PT_2    PT_3   PT_4   
   -------   -------    ------   ----   ----   ----   ----
    A1       1:00AM      0       32.5    20     26     29
    A1       1:02AM      0       32.5    10     29     40
    A1       1:03AM      1       10      5       4      3
    B1       1:04AM      0       29      4       1      9
    B1       1:05AM      0       40      3       4      9
    C1       1:06AM      1       9       7       6      4 

取得できるようにしたいのは次のとおりです。

   Serial2d  Completed  Result   PT_1   PT_2    PT_3   PT_4   
   -------   -------    ------   ----   ----   ----   ----
    A1       1:03AM      1       10      5       4      3
    B1       1:05AM      0       40      3       4      9
    C1       1:06AM      1       9       7       6      4 

私はSQLが初めてで、まだすべての構文を学んでいます。何が必要なのかわからないため、使用する正しい演算子を検索するのが難しいと感じています。無知を許してください。私の答えが書かれた投稿は、私を正面から見つめている可能性があり、私はそれを知りません。それを指摘してください。

以前の投稿への回答に感謝しますが、私の情報不足と SQL の無能さのために、回答は私にとって十分ではありませんでした。これはおそらくめちゃくちゃ簡単な人もいると思いますが、最初に SQL を始めたときのことを思い出してください...それが私がいるところです。

4

4 に答える 4

1

SQL Serverを使用しているため、ウィンドウ関数を使用してこのデータを取得できます。

サブクエリの使用:

select *
from 
(
  select *,
    row_number() over(partition by serial2d 
                      order by result desc, completed desc) rn
  from a12
) x
where rn = 1

SQL FiddlewithDemoを参照してください

または、このクエリにCTEを使用できます。

;with cte as
(
  select *,
    row_number() over(partition by serial2d 
                      order by result desc, completed desc) rn
  from a12
)
select *
from cte c
where rn = 1;

SQL FiddleWithDemoを参照してください

于 2012-10-05T18:54:22.107 に答える
0
SELECT 
  t.Serial,
  max_Result, 
  MAX([time]) AS max_time
FROM 
  myTable t inner join
  (SELECT 
    Serial, 
    MAX([Result]) AS max_Result
   FROM 
    myTable
   GROUP BY 
    Serial) m on
   t.serial = m.serial and
   t.result = m.max_result
group by
 t.serial,
 max_Result
于 2012-10-02T15:51:29.420 に答える
0

でグループ化して、それぞれSerialの を取得できます。MAXTime

SELECT Serial, MAX([Time]) AS [Time]
FROM myTable
GROUP BY Serial
HAVING MAX(Result) => 0
于 2012-10-02T15:42:32.243 に答える
0

これは、相関サブクエリを使用して解決できます。

SELECT 
    T.serial, 
    T.[time], 
    0 AS result
FROM tablename T
WHERE 
    T.result = 1
  OR 
    NOT EXISTS(
        SELECT 1
        FROM tablename
        WHERE 
            serial = T.serial
          AND (
               [time] > T.[time]
             OR 
               result = 1 
          )
    )
于 2012-10-02T15:50:39.907 に答える