SQL делит много записей по дням - PullRequest
0 голосов
/ 25 февраля 2019

структура моей таблицы SQL очень проста, содержит только 3 поля:

createDate(Date): time when record inserted;
title(String): title for record;
count(Integer32): count for record;

Там 10w + записей в таблице!Представляет записи, вставленные за один год:

  • В любой день может быть вставлено любое количество записей (включая 0 записей)

Итак, как я могу разделить записи по дням ???

Например: в таблице 10 записей:

1. 2019-01-01 10:20:15 xxx
2. 2019-01-01 12:50:10 xxx
3. 2019-01-01 23:20:19 xxx

4. 2019-01-02 10:20:15 xxx

5. 2019-01-05 08:20:15 xxx
6. 2019-01-05 22:20:15 xxx

7. 2019-02-10 10:20:15 xxx
8. 2019-02-10 11:20:15 xxx
9. 2019-02-10 15:20:15 xxx

10. 2019-02-15 10:20:15 xxx

Я хочу получить результат: разделить на 5 "коллекций"

коллекция "2019-01-01" (содержит 3записи):

- 2019-01-01 10:20:15 xxx
- 2019-01-01 12:50:10 xxx
- 2019-01-01 23:20:19 xxx

коллекция "2019-01-02" (содержит 1 запись):

- 2019-01-02 10:20:15 xxx

коллекция "2019-01-05" (содержит 2 записи):

- 2019-01-05 08:20:15 xxx
- 2019-01-05 22:20:15 xxx

коллекция "2019-02-10" (содержит 3 записи):

- 2019-02-10 10:20:15 xxx
- 2019-02-10 11:20:15 xxx
- 2019-02-10 15:20:15 xxx

коллекция "2019-02-15" (содержит 1 запись):

- 2019-02-15 10:20:15 xxx

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Попробуйте использовать COUNT от PARTITION:

SELECT 
t.*
, count( CONVERT(date, t.createDate)) OVER (PARTITION BY CONVERT(date, t.createDate) 
    ORDER BY CONVERT(date, t.createDate)) CountByDate    
FROM 
@tempRequestForMeList t

Позвольте мне показать пример (спасибо @DarkRob за примеры данных):

DECLARE @tempRequestForMeList TABLE
(
    createDate DATETIME,
    title NVARCHAR(50),
    [count] INT
);



INSERT INTO @tempRequestForMeList
(
    createDate,
    title,
    count
)
VALUES
('2016-09-20 17:17:04.840', 'dd', 0),
('2016-09-20 17:17:04.840', 'dd', 1),
('2016-09-20 07:17:04.840', 'dd', 1),
('2016-09-20 05:17:04.840', 'dd', 1),
('2016-09-20 13:17:04.840', 'dd', 1),
('2016-09-19 12:17:04.840', 'dd', 1),
('2016-09-19 02:17:04.840', 'dd', 1),
('2016-09-19 01:17:04.840', 'dd', 1),
('2016-09-18 02:17:04.840', 'dd', 1),
('2016-09-18 03:17:04.840', 'dd', 1),
('2016-09-18 05:17:04.840', 'dd', 1),
('2016-09-18 07:17:04.840', 'dd', 1),
('2016-10-20 17:17:04.840', 'dd', 0);

и запрос:

SELECT 
t.*
, count( CONVERT(date, t.createDate)) OVER (PARTITION BY CONVERT(date, t.createDate) 
    ORDER BY CONVERT(date, t.createDate)) CountByDate    
FROM 
@tempRequestForMeList t

ВЫХОД:

createDate                 title    count   CountByDate
2016-09-18 02:17:04.840     dd        1        4
2016-09-18 03:17:04.840     dd        1        4
2016-09-18 05:17:04.840     dd        1        4
2016-09-18 07:17:04.840     dd        1        4
2016-09-19 12:17:04.840     dd        1        3
2016-09-19 02:17:04.840     dd        1        3
2016-09-19 01:17:04.840     dd        1        3
2016-09-20 17:17:04.840     dd        0        5
2016-09-20 17:17:04.840     dd        1        5
2016-09-20 07:17:04.840     dd        1        5
2016-09-20 05:17:04.840     dd        1        5
2016-09-20 13:17:04.840     dd        1        5
2016-10-20 17:17:04.840     dd        0        1
0 голосов
/ 25 февраля 2019

Если моя схема таблицы верна, то это будет вашим возможным решением.

    GO

    CREATE TABLE #tempRequestForMeList   
    (   
         createDate datetime,
         title nvarchar(50),
         [count] int
    )  

    GO

    insert into #tempRequestForMeList ( createDate, title, [count] )
    values ( '2016-09-20 17:17:04.840', 'dd', 0 )
    , ( '2016-09-20 17:17:04.840', 'dd', 1 )
    , ( '2016-09-20 07:17:04.840', 'dd', 1 )
    , ( '2016-09-20 05:17:04.840', 'dd', 1 )
    , ( '2016-09-20 13:17:04.840', 'dd', 1 )
    , ( '2016-09-19 12:17:04.840', 'dd', 1 )
    , ( '2016-09-19 02:17:04.840', 'dd', 1 )
    , ( '2016-09-19 01:17:04.840', 'dd', 1 )
    , ( '2016-09-18 02:17:04.840', 'dd', 1 )
    , ( '2016-09-18 03:17:04.840', 'dd', 1 )
    , ( '2016-09-18 05:17:04.840', 'dd', 1 )
    , ( '2016-09-18 07:17:04.840', 'dd', 1 )

    GO
    ; with cte as (
    select cast(createdate as date) as Date1, * from #tempRequestForMeList )
    update dd set dd.[count] = ct.co from #tempRequestForMeList as dd inner join (select count(date1) as co, date1 from cte group by Date1) as ct on cast(dd.createDate as DATE) = ct.Date1

    select * from #tempRequestForMeList  --- if require count with each row

    go

    drop table #tempRequestForMeList
    go

Если это не сработает, покажите схему таблицы и ожидаемый результат.

Примечание. Этодля сервера SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...