TSQL Выберите количество строк в таблице A, которые имеют хотя бы одну запись в таблице B для каждой минуты метки времени из таблицы B - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в SQL-запросах, и у меня возникла ситуация, когда я не знаю, как ее решить. У меня есть две таблицы, такие как:

Table B
Id AId  Timestamp (datetimeoffset(7) column)
1  1    2017-08-31 08:25:32.7000000 -07:00
2  2    2017-08-31 10:25:32.5000000 -05:00
3  2    2017-08-31 10:25:32.9000000 -05:00
4  8    2017-08-31 10:25:32.5000000 -02:00
5  1    2017-05-30 18:31:43.8000000 +03:00
6  7    2017-05-29 18:31:43.8000000 +03:00

Table A
Id   Name
1    AA
2    AB
7    AC
8    AD

Я попробовал вот что:

select DATEADD(MINUTE, DATEDIFF(MINUTE, 0, p.Timestamp), 0) as TimestampMinute, count(1) Count
from A a
cross apply (select top 1 b.Timestamp from B b where a.Id=b.AId) p
group by DATEADD(MINUTE, DATEDIFF(MINUTE, 0, p.Timestampl), 0)
order by DATEADD(MINUTE, DATEDIFF(MINUTE, 0, p.Timestampl), 0)

но моя проблема в том, что он должен добавить смещение, а затем округлить до минут и посчитать количество строк в таблице А, в которых есть хотя бы одна запись в эту минуту, но оно просто округляется до минуты, игнорируя смещение и я думаю, что это проблема, почему это считается плохим. Итак, на дату 2017-08-31 15:25 у меня должно быть 2 строки из таблицы A (Id 1 и 2). Идентификатор 1 из таблицы A соответствует строке 1 таблицы B, а идентификатор 2 - строке 2 и 3 (применяются разные).

Ожидаемый результат:

2017-08-31 15:25  2
2017-08-31 12:25  1
2017-05-30 15:31  1
2017-05-29 15:31  1

Я пытаюсь учиться на ошибках и совершенствоваться, поэтому, пожалуйста, будьте осторожны.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вам нужен запрос, подобный приведенному ниже

См. Рабочую демонстрацию

; with newB as 
(
    select id,Aid,DATEADD(MINUTE, DATEDIFF(MINUTE, 0, Timestamp)- datepart(tz,Timestamp), 0) as TimestampMinute
    from B
    )

select TimestampMinute, count(distinct Aid) from A join newB B
on A.id=B.Aid
group by TimestampMinute
0 голосов
/ 04 июля 2018

Вам нужно преобразовать datetimeoffset в datetime2 перед округлением в минуты, отсюда и код:

convert(datetime2, b.timestamp, 1) -- timestamp is your column from table b

Третий аргумент ( 1 предназначен для учета различий часовых поясов и расчета его. Если бы он был 0 , он пропустил бы эту часть и преобразовал бы ее, используя +00.00).

Решение:

select 
  DATEADD(MINUTE, DATEDIFF(MINUTE, 0, convert(datetime2, b.timestamp, 1)), 0) as TimestampMinute , 
  count(distinct b.aid) as cnt
from b
inner join a on b.aid = a.id -- new part
group by DATEADD(MINUTE, DATEDIFF(MINUTE, 0, convert(datetime2, b.timestamp, 1)), 0)
order by DATEADD(MINUTE, DATEDIFF(MINUTE, 0, convert(datetime2, b.timestamp, 1)), 0);

Выходы:

TimestampMinute            cnt
2017-05-29 15:31:00.000     1
2017-05-30 15:31:00.000     1
2017-08-31 12:25:00.000     1
2017-08-31 15:25:00.000     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...