Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分析函数中列的sql逗号分隔列表_Sql_Sql Server 2008_Analytics_Aggregate Functions - Fatal编程技术网

分析函数中列的sql逗号分隔列表

分析函数中列的sql逗号分隔列表,sql,sql-server-2008,analytics,aggregate-functions,Sql,Sql Server 2008,Analytics,Aggregate Functions,我正在使用SQLServer2008,我需要创建一个列的常用删除列表。我知道怎么做,但我需要这一次,当我使用分析函数时,我的意思是我不想使用GROUPBY子句。 因为我还将选择外部查询中的记录,其中row_num=1 以下是查询: SELECT UserId ,ProductList ,Value FROM ( SELECT p.UserId ,p.Value , ROW_NUMBER()OVER (PARTITION BY p.UserId

我正在使用SQLServer2008,我需要创建一个列的常用删除列表。我知道怎么做,但我需要这一次,当我使用分析函数时,我的意思是我不想使用GROUPBY子句。 因为我还将选择外部查询中的记录,其中row_num=1

以下是查询:

SELECT UserId
      ,ProductList
      ,Value
  FROM
  (
SELECT p.UserId 
     ,p.Value
     , ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
     --here I need a solution  OVER (PARTITION BY p.UserId) AS 'ProductList'
  FROM Products p
       INNER JOIN
       Users u
       ON p.UserId = u.Id
       ) result
 WHERE result.row_num = 1
用户数据:

Id       Name      ....
 1       John
 2       Anton
 3       Craig
产品数据:

Id      UserId      Name     RecordCreateDate   Value
 1           1         a           21.12.2012      10
 2           1         b           11.12.2012      20
 3           1         c           01.12.2012      30
 4           2         e           05.12.2012      40
 5           2         f           17.12.2012      50
 6           3         d           21.12.2012      60 
 7           3         i           31.12.2012      70
我需要一个结果,例如:

UserId     ProductList      Value
     1           a,b,c         30
     2             e,f         40
     3             d,i         60

感谢您的帮助

我不确定您在开始时要求什么,但这将为您提供所需的输出

SELECT UserId,
  STUFF((SELECT ',' + ProductName from Products p WHERE p.UserID = u.UserID FOR XML PATH('')), 1, 1, '') as ProductList
FROM Users u

我不确定您一开始问的是什么,但这将为您提供所需的输出

SELECT UserId,
  STUFF((SELECT ',' + ProductName from Products p WHERE p.UserID = u.UserID FOR XML PATH('')), 1, 1, '') as ProductList
FROM Users u

因为您要对第_num=1行进行筛选,所以需要将查询放入CTE或类似文件中,其中包括Products中的额外列。然后,可以在外部查询中使用for XML路径技巧构建逗号分隔字符串,而无需使用group by

;WITH C as
(
  SELECT p.UserId 
       , ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
       --, Some other fields from Products
    FROM Products p
         INNER JOIN
         Users u
         ON p.UserId = u.Id
)
SELECT UserId,
       --, Some other fields from Products
       --, Build the concatenated list here using for xml path()
FROM C
WHERE C.row_num = 1 

因为您要对第_num=1行进行筛选,所以需要将查询放入CTE或类似文件中,其中包括Products中的额外列。然后,可以在外部查询中使用for XML路径技巧构建逗号分隔字符串,而无需使用group by

;WITH C as
(
  SELECT p.UserId 
       , ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
       --, Some other fields from Products
    FROM Products p
         INNER JOIN
         Users u
         ON p.UserId = u.Id
)
SELECT UserId,
       --, Some other fields from Products
       --, Build the concatenated list here using for xml path()
FROM C
WHERE C.row_num = 1 

只是为了完整。删除实际解决方案的符号

SET NOCOUNT ON;

CREATE TABLE #users
(
    Id INT,
    Name VARCHAR(32)
);

INSERT #users VALUES
(1,'John'),
(2,'Anton'),
(3,'Craig');

CREATE TABLE #products
(
    Id INT,
    UserId INT,
    Name VARCHAR(32),
    RecordCreateDate DATE,
    Value INT
);

INSERT #products VALUES
(1,1,'a','2012-12-21',10),
(2,1,'b','2012-12-11',20),
(3,1,'c','2012-12-01',30),
(4,2,'e','2012-12-05',40),
(5,2,'f','2012-12-17',50),
(6,3,'d','2012-12-21',60), 
(7,3,'i','2012-12-31',70);
查询:

;WITH x AS 
(
    SELECT UserId, Value, 
        row_num = ROW_NUMBER() OVER 
        (
              PARTITION BY UserId 
              ORDER BY RecordCreateDate
        )
        FROM #products
)
SELECT
  x.UserId,
  u.Name,
  ProductList = STUFF((
     SELECT ',' + Name
        FROM #Products AS p 
        WHERE p.UserId = x.UserId 
        FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,''),
  x.Value
FROM x
INNER JOIN #users AS u
ON x.UserId = u.Id
WHERE x.row_num = 1;
然后清理:

DROP TABLE #users, #products;
结果:

UserId  Name    ProductList  Value
1       John    a,b,c        30
2       Anton   e,f          40
3       Craig   d,i          60

只是为了完整。删除实际解决方案的符号

SET NOCOUNT ON;

CREATE TABLE #users
(
    Id INT,
    Name VARCHAR(32)
);

INSERT #users VALUES
(1,'John'),
(2,'Anton'),
(3,'Craig');

CREATE TABLE #products
(
    Id INT,
    UserId INT,
    Name VARCHAR(32),
    RecordCreateDate DATE,
    Value INT
);

INSERT #products VALUES
(1,1,'a','2012-12-21',10),
(2,1,'b','2012-12-11',20),
(3,1,'c','2012-12-01',30),
(4,2,'e','2012-12-05',40),
(5,2,'f','2012-12-17',50),
(6,3,'d','2012-12-21',60), 
(7,3,'i','2012-12-31',70);
查询:

;WITH x AS 
(
    SELECT UserId, Value, 
        row_num = ROW_NUMBER() OVER 
        (
              PARTITION BY UserId 
              ORDER BY RecordCreateDate
        )
        FROM #products
)
SELECT
  x.UserId,
  u.Name,
  ProductList = STUFF((
     SELECT ',' + Name
        FROM #Products AS p 
        WHERE p.UserId = x.UserId 
        FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,''),
  x.Value
FROM x
INNER JOIN #users AS u
ON x.UserId = u.Id
WHERE x.row_num = 1;
然后清理:

DROP TABLE #users, #products;
结果:

UserId  Name    ProductList  Value
1       John    a,b,c        30
2       Anton   e,f          40
3       Craig   d,i          60

你没有明白我的意思,我不想用“按条款分组”这个词。你要求的结果对我来说毫无意义。该行编号是如何生效的?您希望如何在任何情况下使用第1行作为任何用户标识?您能否显示示例数据和期望的结果,包括使您的where row_num=1要求有意义的结果?我没明白,因为你解释得不够好。我在您的中没有看到行数,我需要一个结果,例如:section,所以我不知道您希望在每行中看到什么行数。另外,您确定UserId和RecordCreatedDate都来自products表吗?这里我将使用row_num:SELECT UserId,ProductList from SELECT p.UserId,ROW_Number按p.UserId分区按p.RecordCreateDate asc排序为“ROW_num”-这里我需要一个解决方案,通过p.UserId分区为“ProductList”,从产品p内部加入用户u ON p.UserId=u.Id result,其中result.ROW_num=1row_num与group BY一样使用。我不想使用group by,因为我需要再次与Products表进行额外连接以获取记录。请显示示例数据和所需结果。试图读取注释中的伪代码是不可能的。不要担心告诉我们你是否想使用像GroupBy这样的结构——也许我们知道一种有效的方法来做到这一点,而你却没有想到。考虑一下你的问题,因为这些是我想要的结果,而不是我想要的结果。你没有抓住重点,我不想使用“按条款分组”。你要求的结果对我来说没有意义。该行编号是如何生效的?您希望如何在任何情况下使用第1行作为任何用户标识?您能否显示示例数据和期望的结果,包括使您的where row_num=1要求有意义的结果?我没明白,因为你解释得不够好。我在您的中没有看到行数,我需要一个结果,例如:section,所以我不知道您希望在每行中看到什么行数。另外,您确定UserId和RecordCreatedDate都来自products表吗?这里我将使用row_num:SELECT UserId,ProductList from SELECT p.UserId,ROW_Number按p.UserId分区按p.RecordCreateDate asc排序为“ROW_num”-这里我需要一个解决方案,通过p.UserId分区为“ProductList”,从产品p内部加入用户u ON p.UserId=u.Id result,其中result.ROW_num=1row_num与group BY一样使用。我不想使用group by,因为我需要再次与Products表进行额外连接以获取记录。请显示示例数据和所需结果。试图读取注释中的伪代码是不可能的。不要担心告诉我们你是否想使用像GroupBy这样的结构——也许我们知道一种有效的方法来做到这一点,而你却没有想到。想想你的问题,因为这些是我想要的结果,而不是我想要的结果。他似乎也需要其中的行数,我想这代表了每个用户创建的最早的产品。但是按UserID划分,我不明白他怎么能为每个UserID得到除1之外的任何东西。他似乎也需要其中的row_num,我想这代表了每个用户创建的最早的产品。但是按用户ID划分,我不明白他怎么能为每个用户ID得到除1以外的任何东西。谢谢。我会试试看,然后告诉你
脚踝。我会试试的,让你知道谢谢。我看不到Users表,我需要在CTE查询后使用Join吗?您需要从Users表中获得什么?您想要的结果中没有任何东西表明需要从该连接中获得任何东西。你的问题还缺少一些信息吗?谢谢。我看不到Users表,我需要在CTE查询后使用Join吗?您需要从Users表中获得什么?您想要的结果中没有任何东西表明需要从该连接中获得任何东西。你的问题还缺少一些信息吗?