从单个表中选择和排序数据

时间:2012-10-02 15:39:23

标签: sql tsql

更正我的问题......

我正在尝试从单个表中选择查询并对其进行排序。表的主键是序列号和时间/日期戳的组合。

数据库中的表名是“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”条目。 (我没有建立这个数据库......我必须使用我得到的东西)

我想编写一个查询,它将利用“Result”列的值(始终为“0”或“1”),并仅为每个“Serial2D”值仅检索唯一行。如果“Result”列的行为“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 个答案:

答案 0 :(得分: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 Fiddle with Demo

或者您可以将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 With Demo

答案 1 :(得分:0)

您可以按Serial分组,以获得每个MAX的{​​{1}}。

Time

答案 2 :(得分: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 
          )
    )

答案 3 :(得分: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