SQL查询语句结构

时间:2014-10-13 20:34:47

标签: sql sql-server

我有一个名为Orders的表:

OrderItemID          CustomerIDNumber          OrderProcessed

1                    9212060068089             False
2                    6412180017080             False
3                    9212060068089             False
4                    5508245127003             False
5                    9212060068089             False

我想做的事情,我似乎真的在努力纠正,是选择订单处理错误的所有唯一客户ID号。

现在这很简单,通过使用DISTINCT,但我正在努力解决的问题部分是,我希望客户ID号仍然按订单商品ID维护订单。所以示例输出应该是:

CustomerIDNumber          OrderProcessed

9212060068089             False
6412180017080             False
5508245127003             False

请注意:处理订单中的所有价值均为假,在我的表格中显而易见,订单处理将有一些真正的价值。

以下是我目前获得的错误输出:

CustomerIDNumber          OrderProcessed

5508245127003             False
6412180017080             False
9212060068089             False

可以看出,它按升序对客户ID号进行排序,这不是我想要的。

2 个答案:

答案 0 :(得分:5)

如何分组和订购?

SELECT CustomerIDNumber, max(OrderProcessed)
FROM dbo.Orders
WHERE OrderProcessed = 'False'--or however you're implementing your boolean here
GROUP BY CustomerIDNUmber
ORDER BY min(OrderItemID)

Sql Fiddle demo

答案 1 :(得分:3)

您可以使用ROW_NUMBER

;WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY CustomerIDNumber ORDER BY OrderItemID)
    FROM dbo.Orders
    WHERE OrderProcessed = 'False'
)
SELECT CustomerIDNumber, OrderProcessed
FROM CTE
WHERE RN = 1
ORDER BY OrderItemID