获取按一行中特定列分组的有序集中的第一行和最后一行

时间:2017-05-22 04:55:21

标签: sql

我有一个数据库,可以跟踪不同数据库中不同模式中每个表的行数。这些细节每晚更新,并为每张桌子保留1年的数据。

我需要一个查询,对于给定的数据库和模式,我可以得到每个表的第一行和最后一行计数以及表名和日期。

例如:

数据库看起来像这样。

DateTime          TableName   RowCount
2017/05/22 22:00  TableA      5000
2016/10/12 22:00  TableA      2500
2016/05/22 22:00  TableA      1000
2017/05/22 22:00  TableB      10000
2016/10/12 22:00  TableB      7500
2016/05/22 22:00  TableB      3000
2017/05/22 22:00  TableC      15000
2016/10/12 22:00  TableC      12500
2016/05/22 22:00  TableC      10000

我需要一个看起来像这样的结果

-------------------------------------------------------------------------------------- 
TableName | Last Row Date     | Last Row Count  | First Row Date    | First Row Count |
--------------------------------------------------------------------------------------- 
TableA    | 2016/05/22 22:00  | 1000            | 2017/05/22 22:00  | 5000            |
TableB    | 2016/05/22 22:00  | 3000            | 2017/05/22 22:00  | 10000           |
TableC    | 2016/05/22 22:00  | 10000           | 2017/05/22 22:00  | 15000           |

我尝试了很多变种,包括CTE和联盟,但是无法得到我需要的结果。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

此查询有效:

select s.table_name,
last_row.date_time last_date,
    last_row.row_count last_count,
    first_row.date_time first_date,
    first_row.row_count first_count
from (
        select distinct table_name
        from history_table 
    ) s,
    (
        select h.date_time, 
            h.row_count,
            h.table_name
        from history_table h
        where h.date_time = (
            select max(h2.date_time)
            from history_table h2
            where h2.table_name = h.table_name
        )
    ) last_row,
    (
        select h.date_time, 
            h.row_count,
            h.table_name
        from history_table h
        where h.date_time = (
            select min(h2.date_time)
            from history_table h2
            where h2.table_name = h.table_name
        )
    ) first_row
where last_row.table_name = s.table_name
    and first_row.table_name = s.table_name