SQL:如何选择最早的行
我有一份类似这样的报告:SQL:如何选择最早的行,sql,date,select,subset,Sql,Date,Select,Subset,我有一份类似这样的报告: CompanyA Workflow27 June5 CompanyA Workflow27 June8 CompanyA Workflow27 June12 CompanyB Workflow13 Apr4 CompanyB Workflow13 Apr9 CompanyB Workflow20 Dec11 CompanyB Wofkflow20
CompanyA Workflow27 June5
CompanyA Workflow27 June8
CompanyA Workflow27 June12
CompanyB Workflow13 Apr4
CompanyB Workflow13 Apr9
CompanyB Workflow20 Dec11
CompanyB Wofkflow20 Dec17
这是通过SQL实现的(特别是T-SQL Server 2005版):
我希望报告仅显示每个工作流的最早日期:
CompanyA Workflow27 June5
CompanyB Workflow13 Apr4
CompanyB Workflow20 Dec11
有什么想法吗?我想不出来。我尝试使用一个嵌套的select返回最早的托盘日期,然后在WHERE子句中设置它。如果只有一家公司,这将非常有效:
SELECT company
, workflow
, date
FROM workflowTable
WHERE date = (SELECT TOP 1 date
FROM workflowTable
ORDER BY date)
但如果该表中有多家公司,这显然是行不通的。感谢您的帮助 只需使用min()
在这种情况下,一个相对简单的
分组依据可以起作用,但一般来说,当存在其他列时,您不能按顺序排序,但希望它们来自与它们相关联的特定行,您可以使用键的所有部分连接回细节,或者使用OVER()
:
为什么WITH命令前面有分号?我也见过几次这样的情况,一开始我一直认为这是我所看到的个人代码中的一个拼写错误。WITH必须是语句中的第一项,SQL Server不会强制执行以分号结尾的所有语句。只要您也不想获得唯一的工作流,这一点就行。在本例中,它将返回公司B的Workflow13和Workflow20,但如果需要每个公司的最早日期来标识工作流,则需要包含一个子选择。
SELECT company
, workflow
, date
FROM workflowTable
WHERE date = (SELECT TOP 1 date
FROM workflowTable
ORDER BY date)
SELECT company, workflow, MIN(date)
FROM workflowTable
GROUP BY company, workflow
SELECT company
, workflow
, MIN(date)
FROM workflowTable
GROUP BY company
, workflow
;WITH partitioned AS (
SELECT company
,workflow
,date
,other_columns
,ROW_NUMBER() OVER(PARTITION BY company, workflow
ORDER BY date) AS seq
FROM workflowTable
)
SELECT *
FROM partitioned WHERE seq = 1