2014-10-26 79 views
0

我正在爲業餘無線電編寫一個程序。一些callsigns將在數據中出現多次,但qsodate將有所不同。我只希望在給定日期後首次出現呼號。如何根據日期從組中選擇第一行

查詢

select distinct 
    a.callsign, 
    a.SKCC_Number, 
    a.qsodate, 
    b.name, 
    a.SPC, 
    a.Band 
from qso a, skccdata b 
where SKCC_Number like '%[CTS]%' 
    AND QSODate > = '2014-08-01' 
    and b.callsign = a.callsign 
order by a.QSODate 

問題:

因爲contacts發生在不同的日期,我得到的所有聯繫人的 - 我曾嘗試加入min(a.qsodate)只得到了第一個,但是後來我遇到的所有有關分組的問題。

該查詢將存儲在存儲過程中,因此創建臨時表或遊標不會成爲問題。

回答

2

您可以使用ROW_NUMBER()與第一日期以獲得第一行,像這樣:

WITH CTE 
AS 
(
    select 
     a.callsign, 
     a.SKCC_Number, 
     a.qsodate, 
     b.name, 
     a.SPC, 
     a.Band, 
     ROW_NUMBER() OVER(PARTITION BY a.callsign ORDER BY a.QSODate) AS RN 
    from qso a,skccdata b 
    where SKCC_Number like '%[CTS]%' 
     AND QSODate > = '2014-08-01' 
     and b.callsign = a.callsign 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 

ROW_NUMBER() OVER(PARTITION BY a.callsign ORDER BY a.QSODate)會給你一個等級數爲每個組的callsignQSODate排序,那麼WHERE RN = 1將消除除第一個具有最小值QSODate之外的所有行。

0

您是否嘗試過使用SELECT TOP 1開始您的查詢...(字段)然後您只會獲得一行。您可以使用TOP x ....爲x行數,或TOP 50 PERCENT針對行的上半部分,等等,那麼你可以在這種情況下消除DISTINCT

編輯:誤解的問題。這個怎麼樣?

select 
    a.callsign, 
    a.SKCC_Number, 
    a.qsodate, 
    (SELECT TOP 1 b.name FROM skccdata b WHERE b.callsign = a.callsign) as NAME, 
    a.SPC, 
    a.Band 
from qso a 
where SKCC_Number like '%[CTS]%' 
    AND QSODate > = '2014-08-01' 
GROUP BY a.QSODate, a.callsign, a.SKCC_Number, a.SPC, a.Band 
order by a.QSODate 

,並添加呼號你的where子句隔離呼號

+0

爲OP希望TOP 1排爲一組,並不是最終的結果集的TOP 1這是行不通的。 – jpw 2014-10-26 14:23:31

+0

Aha OK謝謝@jpw,會編輯答案 – Grantly 2014-10-26 14:35:51

相關問題