按单位分组并显示最近日期

时间:2015-07-17 18:49:32

标签: sql sql-server group-by

我很难为个人项目编写查询。我有一些住房社区的数据,列出了每个单元的所有历史状态。列" HMY"唯一定义的每个状态代表居民留在单元中的一段时间。当居民开始住在一个单位时,你可以在dtStart中看到当居民离开单位时dtEnd。如果dtEnd为NULL,则表示居民目前居住在那里。由于这些是历史状态,因此每个单元有多行。我希望写一个列出所有最新单元的查询。以下是我当前表格的快照:

Table: [Unit_Status]

在伪代码中,我希望按照具有最新记录的单位进行分组(因此hMy的最大值或者甚至当dtEnd为NULL时)。

有没有人有智慧帮助我解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:1)

WITH t1 (property, hunit) AS
(
  SELECT DISTINCT
    property,
    hunit
  FROM table
)
SELECT
  t1.property,
  t1.hunit,
  highest.hmy,
  highest.dtstart,
  highest.dtend
FROM t1

CROSS APPLY
(
  SELECT TOP(1)
    hmy,
    dtstart,
    dtend
  FROM table t

  WHERE
    t.property = t1.property
    AND t.hunit = t1.hunit

  ORDER BY
    hmy DESC

) highest

这个sql首先获得所有属性和单位的明确列表(WITH子句)。然后它使用CROSS Apply来加入记录,最大的hmy回到属性和hunit。

答案 1 :(得分:1)

您可以使用ROW_NUMBER()按hUnit进行分区,然后按hMy按降序排序。然后从每个分区中选择包含最高hMy的第一行。

SELECT hMy,Property,hUnit,dtStart,dtEnd
FROM
(
    SELECT ROW_NUMBER() OVER(PARTITION BY hUnit ORDER BY hMy DESC) RowID,hMy,Property,hUnit,dtStart,dtEnd
    FROM MyTable
) a
WHERE RowID = 1

答案 2 :(得分:0)

在where子句中使用子查询的快速解决方案可能如下所示:

SELECT *
FROM TABLE
WHERE (hMy, hUnit) in (
                       SELECT
                           MAX(hMy),
                           hUnit
                       FROM TABLE
                       GROUP BY
                           hUnit
                       )

这将为您提供hUnit的整行,其中hUnit的hMy最高。