[英]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.