• sqlserver查询一天中时间最大的那行数据


    案例:

    创建天气小时表和天气日期表

    create table dbo.T_WeatherStreetDataHourly (
       ID                   bigint               identity(1, 1),
       DDATETIME            datetime             not null,
       OBTID                nvarchar(50)         collate Chinese_PRC_CI_AS not null,
       WDIDF2               float                null,
       WDIDD2               float                null,
    
       constraint PK_T_WeatherStreetDataHourly primary key (ID)
             on "PRIMARY"
    )
    on "PRIMARY"
    go
    
    create table dbo.T_WeatherStreetDataDaily (
       ID                   bigint               identity(1, 1),
       DDATETIME            datetime             not null,
       OBTID                nvarchar(50)         collate Chinese_PRC_CI_AS not null,
       DAYWD3SMAXDF2        float                null,
       DAYWD3SMAXDD2        float                null,
       constraint PK_T_WeatherStreetDataDaily primary key (ID)
             on "PRIMARY"
    )
    on "PRIMARY"
    go
    

      

    问题:他们都只有 datetime 时间,没有日期date和hour 数据。且datetime 存在重复数据。而显示需要去重显示。

    两种方案:1导入数据时去重;2写一个去重的视图,连表查询。

    去重视图:

    CREATE VIEW V_WeatherStreetDataDailyPart 
    AS
    SELECT CONVERT(date,DDATETIME,112) as DATEA,MAX(DDATETIME) as MaxDATETIME,OBTID
    FROM T_WeatherStreetDataDaily
    GROUP BY CONVERT(date,DDATETIME,112),OBTID
    
    
    select * from  V_WeatherStreetDataDaily  order by DATEA
    
    CREATE VIEW V_WeatherStreetDataHourlyPart
    AS
    SELECT  CONVERT(date,DDATETIME,112) as DATEA,DATEPART(hh,DDATETIME) as Hour,  OBTID ,Max(DDATETIME) as MaxDATETIME
    FROM T_WeatherStreetDataHourly 
    GROUP BY CONVERT(date,DDATETIME,112),DATEPART(hh,DDATETIME),OBTID

    过滤出重复的记录中 日或(日+小时组合)中的DDATETIME 最大的那一行记录!

    然后根据 OBTID 和MaxDATETIME  连表查询。

     --------------------------------------------------------------------------------------------

    知识点1

    selectconvert(date,getdate())
    selectconvert(date,'2016-11-5 12:20:45.567')
    显示:2016-11-05

    知识点2

    sqlserver 截取日期年份和月份使用datepart函数,函数使用方法如下:

    一、函数功能:DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

    二、语法:DATEPART(datepart,date)

    三、参数说明:date 参数是合法的日期表达式。datepart 参数可以是下列的值:

    四、实例

    1、截取年份:datepart(yy,'2017-1-1') 返回:2017

    2、截取月份:datepart(mm,'2017-1-1') 返回:1

    五、datepart函数返回的是整型数值,如果需要返回字符型,那么使用datename()函数,用法与datepart相同,只是返回数据类型不同。

    ------------------------------------------------------------------------------

    参考文章:

    一 整体思路

    https://zhidao.baidu.com/question/93803326.html

    假设你表中的DATA_TIME字段是日期类型,如果是字符类型,需要对下列语句做修改

    SQL SERVER

    SELECT CONVERT(CHAR(8),DATA_TIME,112) 日期,MAX(DATA_DATA)
    FROM TABLE_NAME
    GROUP BY CONVERT(CHAR(8),DATA_TIME,112)
    ORDER BY 1

    ORACLE

    SELECT TRUNC(DATA_TIME) 日期,MAX(DATA_DATA)
    FROM TABLE_NAME
    GROUP BY TRUNC(DATA_TIME)
    ORDER BY 1;

    按照你的要求的话是不是要保留每条记录,然后每条记录再显示出当日的最大值?
    如果是这样,SQL SERVER中需要原表和每日的最大值的嵌套表做关联;ORACLE用分析函数,下面是ORACLE的语句

    SELECT TO_CHAR(DATA_TIME,'YYYY-MM-DD HH24:MI:SS') 时间,
    DATA_DATA "当前值",
    MAX(DATA_DATA) OVER(PARTITION BY TRUNC(DATA_TIME))"当日最大值"
    FROM TABLE_NAME
    ORDER BY 1;

    二、

    SQL Server取datetime的日期部分
    https://www.cnblogs.com/edong/archive/2016/11/18/6077922.html

    SQL按照日、周、月、季度、年统计数据的方法
    转载源:http://www.jb51.net/article/42613.htm

  • 相关阅读:
    yii2之依赖注入与依赖注入容器
    MySQL查询性能优化
    MySQL索引(2)
    go es
    es数据操作入门
    es环境搭建
    gRPC接入etcd
    etcd简单介绍
    Go调用NSQ简单实践
    NSQ快速入门实践
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/12327241.html
Copyright © 2020-2023  润新知