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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM