我正在为业余无线电写一个程序。有些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)来只得到第一个联系人,但后来我遇到了各种关于分组的问题。
此查询将位于存储过程中,因此创建临时表或游标不是问题。
发布于 2014-10-26 22:18:49
您可以使用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)将为QSODate排序的每一组callsign提供一个排名号,然后WHERE RN = 1将删除除第一行之外的所有行,第一行的QSODate最小。
发布于 2014-10-26 22:18:57
如果您尝试使用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并将callsign添加到where子句中以隔离callsign
https://stackoverflow.com/questions/26573893
复制相似问题