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)