T-SQL,如何通过查询来完成这个组?

时间:2013-02-09 09:38:14

标签: sql sql-server sqlite tsql

我对此信息有一个看法:

  

TableA (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中{1}}条款。

我知道理论上SQLite中的第一个查询不应该起作用,但要做到这一点。

如何在SQL Server中执行此查询?

感谢。

3 个答案:

答案 0 :(得分:2)

根据SQL 92,如果使用GROUP BY子句,那么在SELECT输出表达式列表中,您只能使用GROUP BY列表中提到的列或任何其他列,但它们必须是包含在聚合函数中,如count()sum()avg()max()min()so on

像MSSQL这样的服务器,Postgres严格遵守这条规则,但是例如MySQL和SQLite非常放松和宽容 - 这就是为什么它让你感到惊讶。

长话短说 - 如果你想在MSSQL中使用它,请遵守SQL92要求。

答案 1 :(得分:2)

SQL Server中的此查询

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

同样在SQL Server 2005中,您可以将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

答案 2 :(得分:1)

试试这个,

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);

<强> SQLFIDDLE DEMO