0

我正在尝试完成对我来说是一个复杂的查询并且有点卡住了。我要返回几行,但我只想要前 2 行,我需要将 ItemNum 列变成两列 Item1 和 Item2 所以我有一个看起来像这样的结果集。数据源将有 1 - 每个电子邮件和类别的任意数量的行。

Email           Category ItemCount  Date                    ItemNum
jimbo@GMAIL.COM CASE FANS   3       2013-07-16 00:00:00.0   11-999-344
jimbo@GMAIL.COM CASE FANS   3       2013-07-16 00:00:00.0   35-103-178
jimbo@GMAIL.COM CASE FANS   3       2013-07-16 00:00:00.0   35-129-060
miyaa@YAHOO.COM CASE FANS   4       2013-07-16 00:00:00.0   35-146-003
miyaa@YAHOO.COM CASE FANS   4       2013-07-16 00:00:00.0   35-146-017
miyaa@YAHOO.COM CASE FANS   4       2013-07-16 00:00:00.0   35-146-017
miyaa@YAHOO.COM CASE FANS   4       2013-07-16 00:00:00.0   35-146-017

我希望结果看起来像这样

Email           Category    Date                    Item1         Item2
jimbo@GMAIL.COM CASE FANS   2013-07-16 00:00:00.0   11-999-344    35-103-178  
miyaa@GMAIL.COM CASE FANS   2013-07-16 00:00:00.0   11-999-344    35-103-178  

因此,更令人沮丧的是,我无法使用 TempTables 或声明任何变量。

任何帮助,将不胜感激。

谢谢

4

3 回答 3

1

尝试这个:

select a1.email, a1.itemNum, 
(select distinct a3.itemNum
    from myTable a3
    where a3.email = a1.email
    and a3.itemNum > a1.itemNum
    and not exists(
        select 'x' from myTable a4
        where a4.email = a3.email
        and a4.itemNum > a1.itemNum
        and a4.itemNum < a3.itemNum)
)
from myTable a1
where not exists
(select 'x' from myTable a2
where a2.email = a1.email
and a2.itemNum < a1.itemNum)

我假设您的字段区分是电子邮件(几行相同)和 itemNum。

您可以更改有关现有条件的条件。

于 2013-07-18T16:20:52.070 回答
0

尝试这个

;WITH Ranked AS 
(
    select  Email, Category, ItemNum, ROW_NUMBER() OVER ( PARTITION BY  Email, Category ORDER BY ItemCount, Date) AS RowNo
    from MyTable
)
, TopFirst AS 
(
    SELECT Email, Category, ItemNum, RowNo
    FROM Ranked
    WHERE RowNo = 1
)
, TopSecond AS 
(
    SELECT Email, Category, ItemNum, RowNo
    FROM Ranked
    WHERE RowNo = 2
)
SELECT TopFirst.Email, TopFirst.Category, TopFirst.ItemNum AS Item1, ISNULL(TopSecond.RowNo, '')
FROM TopFirst
LEFT OUTER JOIN TopSecond ON TopFirst.Email = TopSecond.Email AND  TopFirst.Category  =  TopSecond.Category 
于 2013-07-18T16:12:16.510 回答
0

根据您使用的数据库,您可以尝试将以下内容添加到您的 SELECT 语句中(我无法针对您的代码进行测试,因此这可能需要修改):

SELECT email OVER(PARTITION BY email, ItemNum ORDER BY email) as EmailPartition

这并不能解决为每个项目添加列的问题,但对于整理您的电子邮件列表并选择 DISTINCT 电子邮件/ItemNum 列表是一个可行的选项。这与乔塔拉斯的回答相结合应该会产生一个有效的查询。

于 2013-07-18T16:33:13.667 回答