如何从按日期分组中选择第一行

时间:2014-10-26 14:14:31

标签: sql sql-server database tsql

我正在为业余无线电节目编写节目。某些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 个答案:

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