我正在为业余无线电节目编写节目。某些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)
只获得第一个,但后来遇到了有关分组的所有问题。
此查询将在存储过程中,因此创建临时表或游标不会有问题。
答案 0 :(得分: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)
会为callsign
排序的每个QSODate
组提供一个排名,然后WHERE RN = 1
将排除除第一个排除了所有行之外的所有行最低QSODate
。
答案 1 :(得分: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
并将callign添加到where子句以隔离calligns