首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从group by date中选择第一行

如何从group by date中选择第一行
EN

Stack Overflow用户
提问于 2014-10-26 22:14:31
回答 2查看 1.2K关注 0票数 0

我正在为业余无线电写一个程序。有些callsigns会在数据中出现多次,但qsodate会有所不同。我只想要在给定日期之后第一次出现呼号。

查询

代码语言:javascript
复制
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)来只得到第一个联系人,但后来我遇到了各种关于分组的问题。

此查询将位于存储过程中,因此创建临时表或游标不是问题。

EN

回答 2

Stack Overflow用户

发布于 2014-10-26 22:18:49

您可以使用ROW_NUMBER()获取第一个日期的第一行,如下所示:

代码语言:javascript
复制
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最小。

票数 2
EN

Stack Overflow用户

发布于 2014-10-26 22:18:57

如果您尝试使用SELECT TOP 1 ...(字段)开始查询,那么您将只得到一行。你可以使用TOP x ...表示x行数,或者表示行的上半部分为TOP 50 PERCENT,等等。在这种情况下,您可以消除DISTINCT

编辑:误解问题。这个怎么样?

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26573893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档