Sql 在某一天获得第一次约会

Sql 在某一天获得第一次约会,sql,tsql,Sql,Tsql,我可以使用以下查询提取已发生约会的列表: SELECT host ,name ,apt_time FROM table ORDER BY apt_time 我将得到: host name apt_time sam bob 2017-01-01 08:00:00.000 sam joe 2017-01-01 12:00:00.000 sam tim 2017-01-05 09:00:00.000 sam kay 2017

我可以使用以下查询提取已发生约会的列表:

SELECT
   host
  ,name
  ,apt_time
FROM
   table
ORDER BY apt_time
我将得到:

host   name   apt_time
sam    bob    2017-01-01 08:00:00.000
sam    joe    2017-01-01 12:00:00.000
sam    tim    2017-01-05 09:00:00.000
sam    kay    2017-01-05 14:00:00.000
然而,我只想看到主持人每天看到的第一次约会,得到如下结果:

host   name   apt_time
sam    bob    2017-01-01 08:00:00.000
sam    tim    2017-01-05 09:00:00.000

第一次约会的干净方法是什么?

一个选项是将WITH TIES子句与Row_Number()配合使用


一个选项是将WITHTIES子句与Row_Number()配合使用


您可以按主机名和日期时间的日期部分使用
ROW\u NUMBER
分区,如下所示:

WITH CTE
AS
(
  SELECT
    host,name,apt_time,
    ROW_NUMBER() OVER(PARTITION BY host,CAST(apt_time AS DATE) 
                      ORDER BY apt_time) AS RN
  FROM table1
)
SELECT host, name, apt_time 
FROM CTE 
WHERE  RN =1


您可以按主机名和日期时间的日期部分使用
ROW\u NUMBER
分区,如下所示:

WITH CTE
AS
(
  SELECT
    host,name,apt_time,
    ROW_NUMBER() OVER(PARTITION BY host,CAST(apt_time AS DATE) 
                      ORDER BY apt_time) AS RN
  FROM table1
)
SELECT host, name, apt_time 
FROM CTE 
WHERE  RN =1

(编辑:将rank()更改为row_number(),因为如果apt_日期相同,后者可能返回多行,这不太可能,但理论上可能)


(编辑:将rank()更改为row_number(),因为如果apt_日期相同,后者可能返回多行,这不太可能,但理论上是可能的)

谢谢!如果我不需要表中的所有列,是否有方法将
SELECT
子句中的内容用于指定的列?只需将
*
更改为
host,name,apt\u time
这是SQL Server语法?至少PostgreSQL不知道这一点。这是SQL标准吗?谢谢!如果我不需要表中的所有列,是否有方法将
SELECT
子句中的内容用于指定的列?只需将
*
更改为
host,name,apt\u time
这是SQL Server语法?至少PostgreSQL不知道这一点。它是SQL标准吗?
| host | name |             apt_time |
|------|------|----------------------|
|  sam |  bob | 2017-01-01T08:00:00Z |
|  sam |  tim | 2017-01-05T09:00:00Z |
WITH 
 tmp1 AS (
   SELECT host, name, to_char(apt_time, 'YYYY-mm-dd') as apt_day, apt_time FROM logins
 ),
 tmp2 AS (
   SELECT host, name, apt_day, row_number() over (partition by host, apt_day order by apt_time asc) as p_rank FROM tmp1
 )
SELECT host, apt_day, name FROM tmp2 WHERE p_rank = 1;

 host |  apt_day   | name
------+------------+------
 foo  | 2017-01-05 | kay
 sam  | 2017-01-01 | bob
 sam  | 2017-01-05 | tim
(3 Zeilen)