【问题标题】:Select specific group of records with GROUP BY and MAX(DATE)使用 GROUP BY 和 MAX(DATE) 选择特定的记录组
【发布时间】:2016-01-15 20:44:14
【问题描述】:

例如,我正在尝试为表中的每个机构登记其最近访问日期为“是”的机构;

Agency Id   Date of Visit   Passed 
1           8/19/2015       No
1           6/9/2015        Yes
1           2/6/2015        No
2           9/2/2015        No
2           5/11/2015       Yes
2           3/4/2015        Yes
3           9/10/2015       Yes
3           5/11/2015       No
3           3/5/2015        No
4           10/6/2015       Yes
4           5/19/2015       No
4           3/25/2015       Yes

表格中所需的结果应该只有以下,因为它们在最近的日期被标记为是

Agency Id   Date of Visit   Passed 
3           9/10/2015       Yes
3           5/11/2015       No
3           3/5/2015        No
4           10/6/2015       Yes
4           5/19/2015       No
4           3/25/2015       Yes

我尝试过使用

SELECT agencyid, max(dateofvisit), passed
FROM tblAgency
WHERE passed = 'Yes'
GROUP BY agencyid

但这似乎不起作用,因为它会从表中带来所有被传递为“是”的记录。

如果可以的话,谁能告诉我。

【问题讨论】:

  • 必须是他们过去的最后日期,还是应该在某个时间过去?
  • 必须传入最新日期
  • 通用 GROUP BY 规则:“如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。”
  • 嗨@MohsinTester 我已经查看了您的查询并得出结论,您希望选择以下机构列表: (1) Passed='Yes' (2) 考虑最近的访问日期(即,如果两条记录 Passed= '是'然后考虑最近访问日期的记录)请确认。
  • 不,如果您查看想要的结果,很明显,无论过去通过什么结果,最近访问日期都应该有“是”。

标签: sql oracle group-by


【解决方案1】:

使用分析函数获取“通过”列的最后一个值。那么就很简单了:

select * 
from(
    select 
      agencyid,
      passed,
      first_value(passed) over (partition by agencyid order by dateofvisit desc) last_passed_value,
      dateofvisit
    from tblAgency
)
where last_passed_value = 'Yes';

你也可以只用group bys 和simple max 来做,但是你需要一些连接:

select b.* 
from(
    select 
      agencyid,
      max(dateofvisit) as max_dateofvisit
    from tblAgency
    group by agencyid
) lastentry
join tblAgency a on a.agencyid = lastentry.agencyid and a.dateofvisit=lastentry.dateofvisit
join tblAgency b on a.agencyid = b.agencyid 
where a.passed = 'Yes'

【讨论】:

  • 我按原样使用,但它显示first_value is not a recognized built in function name的错误
  • first_value 是一个有效的函数名。 orafaq.com/node/55你用的是什么版本的Oracle?
  • 我正在使用 SSMS 2008R2。那个功能兼容吗?
  • 我不知道什么是 SSMS 2008R2 但似乎不是 Oracle 的版本。我将发布一个 SQL 标准版本。
  • 好吧,它的 SQL server 2008
【解决方案2】:

通过以下 SQL 查询,我得到了预期的结果。请回复我您的反馈。

---create table
DECLARE @tblAgency TABLE
(
    AgencyId INT,
    dateofvisit DateTime,
    Passed Nvarchar(10)
)

---Insert Records
INSERT INTO @tblAgency VALUES(1,'2015/8/19','No')
INSERT INTO @tblAgency VALUES(1,'2015/6/9','Yes')
INSERT INTO @tblAgency VALUES(1,'2015/2/6','No')
INSERT INTO @tblAgency VALUES(2,'2015/9/2','No')
INSERT INTO @tblAgency VALUES(2,'2015/5/11','Yes')
INSERT INTO @tblAgency VALUES(2,'2015/3/4','Yes')
INSERT INTO @tblAgency VALUES(3,'2015/9/10','Yes')
INSERT INTO @tblAgency VALUES(3,'2015/5/11','No')
INSERT INTO @tblAgency VALUES(3,'2015/3/5','No')
INSERT INTO @tblAgency VALUES(4,'2015/10/6','Yes')
INSERT INTO @tblAgency VALUES(4,'2015/5/19','No')

DECLARE @PassedAgency Table
(
    AgencyId INT
)

--Select AgencyId with Passed='Yes' with Latest dateofvisit
INSERT INTO @PassedAgency
SELECT TM.AgencyId FROM @TblAgency AS TM
OUTER APPLY(SELECT MAX(TD.dateofvisit) AS MaxDate FROM @TblAgency AS TD WHERE TD.AgencyId=TM.AgencyId) A
WHERE TM.DateofVisit=A.MaxDate AND TM.Passed='Yes'


--select agency details
SELECT * from @TblAgency AS tbl1
LEFT JOIN @PassedAgency AS tbl2 ON tbl1.AgencyId=tbl2.AgencyId
WHERE tbl2.AgencyId IS NOT NULL ORDER BY tbl1.AgencyId,tbl1.dateofvisit desc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2016-11-17
    • 2011-03-30
    • 1970-01-01
    • 2021-08-02
    • 2015-11-11
    相关资源
    最近更新 更多