SQL Запрос нескольких пользователей, которые начали в тот же день - PullRequest
3 голосов
/ 07 января 2020

У меня есть таблица примерно такая:

UserID  TeamID  StartedDate
36202   1213    27/11/2019 9:00
36203   1213    1/11/2019 10:30
36203   1207    24/11/2019 10:00
36205   1207    21/11/2019 9:15
36203   1213    1/11/2019 10:30
36214   1217    10/11/2019 10:00
36205   1207    24/11/2019 10:00
36202   1213    1/11/2019 10:30

Как запросить список пользователей, у которых одинаковые « StartedDate » для каждой уникальной даты?

Вывод должен выглядеть следующим образом.

StartedDate         UserID's
24/11/2019 10:00    36203 & 36205
1/11/2019 10:30     36202 & 36203

Мне нужно игнорировать время и сосредоточиться только на дате.

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Вы можете добиться этого таким образом, Live демо здесь

SELECT DISTINCT C2.StartedDate, 
SUBSTRING(
(
   SELECT ', ' + CAST(C1.UserID AS VARCHAR(20))
   FROM TempTable C1
   WHERE C1.StartedDate = C2.StartedDate
  ORDER BY C1.StartedDate
  FOR XML PATH ('')
), 2, 1000) AS "UserList"
FROM TempTable C2

Вывод

StartedDate          UserList
1/11/2019 10:30      36203, 36203, 36202
10/11/2019 10:00     36214
21/11/2019 9:15      36205
24/11/2019 10:00     36203, 36205
27/11/2019 9:00      36202
1 голос
/ 07 января 2020

Попробуйте это:

DECLARE @DataSource TABLE
(
    [UserID] INT
   ,[TeamID] INT
   ,[StartedDate] VARCHAR(24)
);

INSERT INTO @DataSource ([UserID], [TeamID], [StartedDate])
VALUES (36202, 1213,  '27/11/2019 9:00')
      ,(36203, 1213,  '1/11/2019 10:30')
      ,(36203, 1207,  '24/11/2019 10:00')
      ,(36205, 1207,  '21/11/2019 9:15')
      ,(36203, 1213,  '1/11/2019 10:30')
      ,(36214, 1217,  '10/11/2019 10:00')
      ,(36205, 1207,  '24/11/2019 10:00')
      ,(36202, 1213,  '1/11/2019 10:30');

-- SQL Server 2017+
SELECT [StartedDate]
      ,STRING_AGG([UserID], ',') AS [UserID's]
FROM
(
    SELECT DISTINCT [StartedDate]
                   ,[UserID]
    FROM @DataSource
) DS
GROUP BY [StartedDate];

-- SQL Server
WITH DataSoruce AS
(
    SELECT DISTINCT [StartedDate]
    FROM @DataSource
)
SELECT *
FROM DataSoruce A
CROSS APPLY
(
    SELECT STUFF
    (
        (
            SELECT DISTINCT ',' + CAST([UserID] AS VARCHAR(12))
            FROM @DataSource S
            WHERE A.[StartedDate] = S.[StartedDate]
            FOR XML PATH, TYPE 
        ).value('.', 'VARCHAR(MAX)')
        ,1
        ,1
        ,''
    )
) R ([UserID's])
0 голосов
/ 07 января 2020

Вы можете использовать приведенный ниже код.

Вам нужно ЗА XML и ПУТЬ

SELECT DISTINCT 
   CONVERT(DATE, StartedDate)  AS StartedDate,
   STUFF(
       (
           SELECT DISTINCT ' & ' + CAST(userid AS VARCHAR(MAX))
           FROM   #YourTable
           WHERE  (
                      CONVERT(DATE, StartedDate) = CONVERT(DATE, Results.StartedDate)
                  )
                  FOR XML PATH(''),TYPE
       ).value('(./text())[1]', 'VARCHAR(MAX)'),
       1,
       2,
       ''
   )                                AS 'UserID''s'
FROM   #YourTable                               Results
...