2014-10-26 45 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

相关问题