更正我的问题......
我正在尝试从单个表中选择查询并对其进行排序。表的主键是序列号和时间/日期戳的组合。
数据库中的表名是“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时,请记住这就是我在的地方。
答案 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
或者您可以将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;
答案 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