0

谢谢您的帮助!我正在使用 MS SQL Server 17 并尝试按 ID 进行分组,并根据共享 ID 在第二列中找到常见的配对。大多数其他问题涉及找到多个列之间的任何组合。

以下是一些示例数据:

/* Create sample data */ 
 DROP TABLE IF EXISTS example
 CREATE TABLE example (
    PersonID int,
    Place varchar(50)
 )

 INSERT INTO example (PersonID, Place)
 VALUES (1, 'home'), (2, 'work'), (3, 'gym'), (1, 'grocery'), (1, 'home'), (2, 'gym'), (3, 'work'), 
        (4, 'school'), (2, 'gym'), (3, 'gym'), (4, 'home'), (4, 'school'), (4, 'work'), (5, 'bar')

 SELECT * FROM example
 Order by PersonID asc

每当 aPersonID有不止一行时,我希望看到Place以下格式的常见配对(对于桑基图)。

from      | to       | count
____________________________
gym       | gym      | 2
gym       | work     | 2
school    | school   | 1
home      | home     | 1
school    | work     | 1
grocery   | home     | 1 

配对可以用于同一个地方,例如两次,但我只需要从到格式中的两个配对PersonID == 1'home'

到目前为止,我已经尝试了 STRING_AGG 函数,但我很难将其限制为双向配对。非常感谢您的帮助,如果这是一个之前已经解决的简单答案,我深表歉意。

试图:

/* Next, let's try to make our Sankey data (from, to, count) */
DROP TABLE IF EXISTS temp_example
SELECT t.combination, COUNT(*) AS value
INTO temp_example
FROM (SELECT STRING_AGG(Place, ',') within group (order by Place) combination 
           FROM example
           GROUP BY PersonID
           HAVING COUNT(*) >= 2
     ) t
GROUP BY t.combination
ORDER BY value desc
4

1 回答 1

1

首先,您需要另一列。一种可用于识别该人访问这些地点的顺序。SQL 表是无序的,因此插入数据的顺序是不够的。例如,添加一个时间戳列什么的?

然后,使用 LAG() 找出每一行之前访问过的地方。之后是一个简单的 GROUP BY。

WITH
  lagged AS
(
  SELECT
    *, 
    LAG(place) OVER (PARTITION BY PersonID ORDER BY aTimestampOrSomething) AS prevPlace
  FROM
    example
)
SELECT
  prevPlace,
  place,
  COUNT(*)
FROM
  lagged

(抱歉错别字等,我在打电话)

于 2020-08-29T18:16:51.750 回答