如何从此结果集中选择前1个值

时间:2013-11-12 04:38:00

标签: sql sql-server tsql

我在存储过程中有这个查询:

SELECT    DISTINCT
 a.UserProfileId,
 a.FromProfileId,
  mm.FromProfileId as ToProfileID
FROM      ( SELECT
          mup.UserProfileId,
          mmb.FromProfileId
        FROM      dbo.Mindcracker_MailBox mmb
        LEFT JOIN Mindcracker_UserProfile mup
          ON mmb.ToProfileId=mup.UserProfileId
        WHERE     mup.UserProfileId=1144 ) a
LEFT JOIN  dbo.Mindcracker_MailBox mm
ON a.FromProfileId=mm.ToProfileId

以上查询产生以下结果:

UserProfielId  FromProfileID  ToProfielID
1144    1152    1144
1144    1152    1378
1144    1152    1483
1144    1333    1143
1144    1333    1148
1144    1333    1290
1144    1333    1297
1144    1333    1333
1144    1333    1378
1144    1378    1143
1144    1378    1185
1144    1378    1333
1144    1378    1378
1144    1483    1143
1144    1483    1144
1144    1483    1297
1144    1483    1483
1144    11526   1148
1144    11526   1290
1144    11526   1333
1144    11526   1378
1144    11526   11526

我想在FromProfileId Column的基础上得到唯一的值,我的输出应该是这样的:

1144    1152    1144
1144    1333    1143
1144    1378    1143
1144    1483    1143

6 个答案:

答案 0 :(得分:0)

尝试此查询以获取OutPut的前四个值。

执行此查询您将收到存储过程的结果:

  

SELECT TOP 4 FromProfielId,UserProfielId,ToProfielID FROM [Your TableName];

我希望你能得到解决方案。

答案 1 :(得分:0)

我认为你应该删除不同的并通过UserProfileId添加组,FromProfileId

答案 2 :(得分:0)

尝试添加此

ORDER BY amount [ColumnName] LIMIT 4

答案 3 :(得分:0)

对从存储过程中获得的结果集执行以下查询。

SELECT TOP 1 * FROM [TableName] ORDER BY FromProfielId;

答案 4 :(得分:0)

try using ranking_functions tutorial

 with cte as (
        SELECT    DISTINCT
         a.UserProfileId,
         a.FromProfileId,
          mm.FromProfileId as ToProfileID
        FROM      ( SELECT
                  mup.UserProfileId,dense_rank() over (order by mmb.FromProfileid) as rn

                FROM      dbo.Mindcracker_MailBox mmb
                LEFT JOIN Mindcracker_UserProfile mup
                  ON mmb.ToProfileId=mup.UserProfileId
                WHERE     mup.UserProfileId=1144 ) a
        LEFT JOIN  dbo.Mindcracker_MailBox mm
        ON a.FromProfileId=mm.ToProfileId
        order by profile_ID
        )

        select * from cte where rn between 1 AND 4

答案 5 :(得分:0)

虽然这个问题已经很久以前了,但可能有人会发现它很有用。

要获取每个数据集的第一行,您需要使用窗口函数来窗口化结果集。

我只是制作你的结果集并根据它查询输出。它可以扩展为原始查询。

创建表格

CREATE TABLE #tbl(UserProfielId INT, FromProfileID INT, ToProfielID INT)

示例数据

INSERT #tbl
SELECT 1144  ,  1152  ,  1144 UNION ALL
SELECT 1144  ,  1152  ,  1378 UNION ALL
SELECT 1144  ,  1152  ,  1483 UNION ALL
SELECT 1144  ,  1333  ,  1143 UNION ALL
SELECT 1144  ,  1333  ,  1148 UNION ALL
SELECT 1144  ,  1333  ,  1290 UNION ALL
SELECT 1144  ,  1333  ,  1297 UNION ALL
SELECT 1144  ,  1333  ,  1333 UNION ALL
SELECT 1144  ,  1333  ,  1378 UNION ALL
SELECT 1144  ,  1378  ,  1143 UNION ALL
SELECT 1144  ,  1378  ,  1185 UNION ALL
SELECT 1144  ,  1378  ,  1333 UNION ALL
SELECT 1144  ,  1378  ,  1378 UNION ALL
SELECT 1144  ,  1483  ,  1143 UNION ALL
SELECT 1144  ,  1483  ,  1144 UNION ALL
SELECT 1144  ,  1483  ,  1297 UNION ALL
SELECT 1144  ,  1483  ,  1483 UNION ALL
SELECT 1144  ,  11526 ,  1148 UNION ALL
SELECT 1144  ,  11526 ,  1290 UNION ALL
SELECT 1144  ,  11526 ,  1333 UNION ALL
SELECT 1144  ,  11526 ,  1378 UNION ALL
SELECT 1144  ,  11526 ,  11526

<强>查询

使用ROW_NUMBER功能在CTE中显示结果集,然后根据您的主查询进行查询。

;WITH C AS(
    SELECT  ROW_NUMBER() OVER (PARTITION BY FromProfileID ORDER BY FromProfileID) AS Rn
            ,UserProfielId
            ,FromProfileID
            ,ToProfielID
    FROM #tbl
)

SELECT  UserProfielId
        ,FromProfileID
        ,ToProfielID
FROM C
WHERE Rn = 1

<强>输出

UserProfielId   FromProfileID   ToProfielID
1144            1152            1144
1144            1333            1143
1144            1378            1143
1144            1483            1143
1144            11526           1148

SQLFiddle Demo