[英]Return all columns from a table but only return rows where a specific column is distinct
我正在制作各种购物车应用程序,因此,当用户登录是否订购商品时,会OrderNumber
分配OrderNumber
。 当他将物品放入购物车时,订单将存储在数据库中,如下所示:
+---+------------+-----------+------------+
|num|CustomerItem|OrderNumber|CustomerName|
+---+------------+-----------+------------+
|1 |Candles |12 |Dorothy |
+---+------------+-----------+------------+
|2 |Keyboard |11 |Kirk |
+---+------------+-----------+------------+
|3 |Lotion |12 |Dorothy |
+---+------------+-----------+------------+
|4 |Monitor |11 |Kirk |
+---+------------+-----------+------------+
|5 |Cups |13 |Kathy |
+---+------------+-----------+------------+
现在,这是我想返回的
+---+------------+-----------+------------+
|num|CustomerItem|OrderNumber|CustomerName|
+---+------------+-----------+------------+
|4 |Monitor |11 |Kirk |
+---+------------+-----------+------------+
|1 |Candles |12 |Dorothy |
+---+------------+-----------+------------+
|5 |Cups |13 |Kathy |
+---+------------+-----------+------------+
这些语句是我尝试过的:
select * from [mytable] where
[OrderNumber] in (Select max(OrderNumber) FROM [mytable] group by OrderNum)
和
select * from [mytable] where
[OrderNumber] in (Select Distinct OrderNumber FROM [mytable] group by OrderNum)
这两个语句都不起作用,它们都在OrderNumber
列中显示重复项
您可能想尝试类似的方法:
SELECT *
FROM [mytable]
WHERE ([OrderNumber], num) IN (
SELECT OrderNumber, max(Numb)
FROM [mytable]
GROUP BY OrderNum
)
我认为您正在寻找与众不同的http://www.w3schools.com/sql/sql_distinct.asp
select distinct customeritem ,ordernnumber,customername
from [mytable]
这将列出所有订购的物品。 您将以这种方式释放num(PK)列,但没有真正的方法来获得它,因为它将是唯一的,因此不会重复。 您可以添加一个group by和一个count(*)以获取他们订购的数量
如果您想要特定OrderNumber
具有最高num
值的行(这与您的预期结果不符,但您尚未阐明规则),则:
; With Ordered as (
Select *,
ROW_NUMBER() OVER (PARTITION BY OrderNum
ORDER BY num desc) as rn
FROM [mytable]
)
select * from Ordered where rn = 1
由于每个OrderNumber的每一行的CustomerName都相同,因此您需要制定一条规则来确定将返回哪个Num和CustomerItem 。
但是,查看所需的样本输出后,您将为每个样本使用不同的逻辑规则。
例:
[Num] [CustomerItem] [OrderNumber] [CustomerName]
1 Candles 12 Dorothy
2 Keyboard 11 Kirk
3 Lotion 12 Dorothy
4 Monitor 11 Kirk
您想返回这两个:
4 Monitor 11 Kirk
1 Candles 12 Dorothy
现在,对于Monitor ,Num和CustomerItem都以降序表示第一个结果,无论您使用哪个字段对其进行排序。 对于Candles ,Num和CustomerItem均表示升序。 因此,可能还有其他原因导致我们不知道订购的顺序,或者您要的是不合逻辑的。
否则,您可以简单地执行以下操作:
select DISTINCT CA.*
from [mytable] MT
CROSS APPLY (SELECT TOP 1 * FROM mytable T2 WHERE T2.OrderNumber = MT.OrderNumber ORDER BY T2.Num asc) CA
它将为每组OrderNumbers返回第一行,按Num排序。 对于较大的表,将myTable联接到具有GROUP BY OrderNumber和MAX(Num)的子查询,使用这两个作为联接值,将创建相同的结果,但效率更高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.