ฉันไปงานปาร์ตี้ช้าสุด ๆ แต่สิ่งนี้ไม่ปรากฏในคำตอบที่มีอยู่:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
10
และMINUTE
เงื่อนไขสามารถเปลี่ยนเป็นจำนวนใด ๆ และDATEPART
ตามลำดับ
- มันเป็น
DATETIME
ค่าซึ่งหมายความว่า:
- มันทำงานได้ดีในช่วงเวลานาน (ไม่มีการชนกันระหว่างปี)
- การรวมไว้ใน
SELECT
คำสั่งจะให้คอลัมน์ผลลัพธ์ของคุณด้วยเอาต์พุตที่ถูกตัดทอนในระดับที่คุณระบุ
'2000'
เป็น "จุดยึดวันที่" ซึ่ง SQL จะทำการคำนวณวันที่ Jereonh ค้นพบด้านล่างว่าคุณพบจำนวนเต็มล้นกับจุดยึดก่อนหน้า ( 0
) เมื่อคุณจัดกลุ่มวันที่ล่าสุดตามวินาทีหรือมิลลิวินาที †
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
AS [date_truncated],
COUNT(*) AS [records_in_interval],
AVG(aa.[value]) AS [average_value]
FROM [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
ถ้าข้อมูลของคุณช่วงศตวรรษ‡ใช้วันที่สมอเดียวสำหรับสองหรือมิลลิวินาทีการจัดกลุ่มจะยังคงพบล้น หากสิ่งนั้นเกิดขึ้นคุณสามารถขอให้แต่ละแถวยึดการเปรียบเทียบการ binning กับเที่ยงคืนของวันที่:
ใช้DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
แทน'2000'
ตำแหน่งที่ปรากฏด้านบน ข้อความค้นหาของคุณจะไม่สามารถอ่านได้ทั้งหมด แต่จะใช้งานได้
ทางเลือกอื่นอาจCONVERT(DATETIME, CONVERT(DATE, aa.[date]))
เป็นการทดแทน
† 2 32 ≈ 4.29E + 9 ดังนั้นหากคุณDATEPART
มีที่SECOND
คุณจะได้รับ 4300000000 วินาทีด้านใดด้านหนึ่งหรือ "สมอ± 136 ปี." ในทำนองเดียวกัน 2 32มิลลิวินาทีเป็น≈ 49.7 วัน
‡หากข้อมูลของคุณครอบคลุมหลายศตวรรษหรือพันปีและยังคงถูกต้องถึงที่สองหรือมิลลิวินาที…ขอแสดงความยินดี! ไม่ว่าคุณจะทำอะไร
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
เพื่อที่ว่าเมื่อฉันดูข้อมูลมันมีความสัมพันธ์กับช่วงเวลาที่ใกล้ที่สุด