2012-10-02 28 views
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」和「Result」列中有多個具有不同值的「Serial2D」條目。 (我沒有做這個數據庫...我必須與我得到的東西)

我想寫一個查詢,將利用「結果」列的值(總是一個「0」或「1」 )併爲每個「Serial2D」值檢索唯一的行。如果「結果」列對於該行具有「1」,我想在具有在結果列中具有「0」的該串行的任何條目選擇它。對於任何Serial2D值,表中只應有一個結果列條目爲「1」的條目。

Ex。表

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

有關研究最多如何()嘗試http://msdn.microsoft.com/en-us/library/ms187751.aspx –

+0

可能重複[Max(SQL-Server)](http://stackoverflow.com/questions/2846976/max-sql-server) –

回答

0

您可以通過Serial進行分組,得到每個TimeMAX

SELECT Serial, MAX([Time]) AS [Time] 
FROM myTable 
GROUP BY Serial 
HAVING MAX(Result) => 0 
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 
     ) 
    ) 
+0

非常感謝。什麼是相關的子查詢? –

+0

@АртёмЦарионов它是一個子查詢,它依賴於來自外部查詢的值。這裏有幾個例子:http://www.databasejournal.com/features/mssql/article.php/3485291/Using-a-Correlated-Subquery-in-a-T-SQL-Statement.htm – acatt

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