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”。

前任。桌子

   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,因此您可以使用 Windowing Functions 来获取此数据。

使用子查询:

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

请参阅带有演示的 SQL Fiddle

或者您可以使用 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 Fiddle

于 2012-10-05T18:54:22.107 回答
0

您可以分组Serial以获取MAX每个Time.

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,
  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

这可以使用相关的子查询来解决:

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