T-SQL,如何通过查询来完成这个组?
我有这个信息的视图:T-SQL,如何通过查询来完成这个组?
表A(IDTableA,IDTableB,IDTableC,活动,日期,...)
对于每一个注册在TableA
和tableC
每个寄存器,我想要tableB
有最大日期和有效的注册。
select IDTableA, IDtableC, IDTableB, Date, Active
from myView
where Active = 1
group by IDTableA, IDTableC
Having Max(Date)
order by IDTableA;
此查询的工作与SQLite
,但如果我尝试在SQL Server
此查询我得到那个说IDTableB
在select
未包含在group
子句中的错误。
我知道理论上SQLite中的第一个查询不应该工作,但是要这样做。
如何在SQL Server中执行此查询?
谢谢。
试试这个,
select * from table1 b
where active = 1
and date = (select max(date) from table1
where idtablea = b.idtablea
and idtablec = b.idtablec
and active = 1);
没有必要放置一个“GROUP BY”条件来获得所需的结果。 – Orangecrush 2013-02-09 10:28:49
这是仅使用视图还是我必须使用三个表? – 2013-02-09 10:44:56
@ÁlvaroGarcía这只是使用视图。将'table1'替换为'TableA'(我假设它是你的视图的名字)。 – Orangecrush 2013-02-09 10:46:53
根据SQL 92,如果你使用GROUP BY
条款,然后在SELECT
输出表达式列表中,您只能使用GROUP BY
列表中提及的列,或任何其他栏目,但它们必须包装在聚合函数中,如count()
,sum()
,avg()
,max()
,min()
和so on。
一些像MSSQL,Postgres这样的服务器严格遵守这个规则,但是例如MySQL和SQLite都非常轻松和宽容 - 这就是为什么它让你感到惊讶。
长话短说 - 如果你想在MSSQL中工作,坚持SQL92的要求。
该查询SQLServer中
select IDTableA, IDtableC, IDTableB, Date, Active
from myView v1
where Active = 1
AND EXISTS (
SELECT 1
FROM myView v2
group by v2.IDTableA, v2.IDTableC
Having Max(v2.Date) = v1.Date
)
order by v1.IDTableA;
OR
此外,在SQLServer2005的+,你可以使用CTE与ROW_NUMBER
;WITH cte AS
(
select IDTableA, IDtableC, IDTableB, [Date], Active,
ROW_NUMBER() OVER(PARTITION BY IDTableA, IDTableC ORDER BY [Date] DESC) AS rn
from myView v1
where Active = 1
)
SELECT *
FROM cte
WHERE rn = 1
ORDER BY IDTableA
包括它的'GROUP BY'子句。什么'HAVING MAX(日期)'等于什么,到底是什么? – 2013-02-09 09:41:14
这是用于SQL Server还是用于SQLite? – 2013-02-09 10:47:50