我很难为个人项目编写查询。我有一些住房社区的数据,列出了每个单元的所有历史状态。列" HMY"唯一定义的每个状态代表居民留在单元中的一段时间。当居民开始住在一个单位时,你可以在dtStart中看到当居民离开单位时dtEnd。如果dtEnd为NULL,则表示居民目前居住在那里。由于这些是历史状态,因此每个单元有多行。我希望写一个列出所有最新单元的查询。以下是我当前表格的快照:
在伪代码中,我希望按照具有最新记录的单位进行分组(因此hMy的最大值或者甚至当dtEnd为NULL时)。
有没有人有智慧帮助我解决这个问题?
谢谢!
答案 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最高。