2011-06-23 81 views
4

最新的項目我有這樣一個SQL Server表:SQL服務器選擇的每一行

id(autoincrement) 
hostname(varchar) 
group(varchar) 
member(varchar) 
datequeried(varchar) 

該表由掃描網絡的Windows客戶端PC的本地管理員組成員預定作業填滿。

  • 網絡掃描 - 接縫事實上可能發生某些站點在掃描期間不可用。

,我想要寫入的查詢是:

"select every hostname having the latest datequeried" 

這是爲了顯示查詢網絡上的每個主機名的最新結果(行)。

是否清楚? 我仍然面臨一些語法問題,我相信這很容易。

在此先感謝。

+0

'SELECT * FROM table WHERE datequeried = MAX(datequeried)'? –

+1

我注意到(和大多數答案似乎已經忽略),由於一些可怕的原因,datequeried是'varchar'。我們能否至少希望它將日期(時間)值以字符串排序的方式存儲(例如YYYYMMDD或類似的)?您現在可以修改模式以使用更合適的數據類型(日期時間或(假設爲20008)日期時間2或日期)? –

回答

2

如果你的SQL Server 2005 或更新(你沒有指定...),你可以用一個CTE來做到這一點:

;WITH MostCurrent AS 
(
    SELECT 
     id, hostname, group, 
     member, datequeried, 
     ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) 'RowNum' 
    FROM 
     dbo.YourTable 
) 
SELECT * 
FROM MostCurrent 
WHERE RowNum = 1 

SELECT的CTE「內按hostname分區「數據,例如每個hostname獲得一組新的「數據組」,併爲每個組編號從1開始的條目。這些條目按datequeried DESC編號,所以最近的條目對於每組數據(例如對於每個hostname)具有RowNum = 1

1

從SQL 2005和更高版本,可以使用ROW_NUMBER()這樣的:

;WITH CTE AS 
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) AS RowNo 
FROM YourTable 
) 

SELECT * FROM CTE WHERE RowNo = 1 

「CTE」是Commom Table Expression,基本上只是別名,首先選擇哪一個,我可以在第二查詢,則使用。

這將返回1行的每個主機名,與該行返回每個都是一個

0
select hostname, 
     max(datequeried) as datequeried 
from YourTable 
group by hostname 
0
SELECT TOP 1 WITH TIES * 
FROM YourTable 
ORDER BY ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) 
0
  1. 你想找到每個站最近的掃描?
  2. 或者您想查找在最近一次掃描期間在線(或不在線)的每一個電臺嗎?

我會首先列出一個工作站主列表。然後我會有一個主掃描列表。然後我會擁有掃描結果的掃描表。

要回答#1,您應該使用子查詢或內聯視圖,它爲每個工作站返回其id和max(scandate),然後您將該子查詢加入到掃描表中以提取掃描行該scandate與其max(scandate)匹配的工作站ID。

要回答#2,你會尋找其中存在的記錄的所有工作站(或者不存在的記錄,比照)在掃描表,其中鈧=最大值(日期)在主掃描列表。

1

我可以用顯示所需要的結果:

select hostname, member, max(lastdatequeried) 
    as lastdatequeried 
    from members 
    group by hostname, member order by hostname 

感謝所有誰幫助。

+0

如果是正確答案,請將其標記爲已接受。我已將您的未註冊帳戶與您註冊的帳戶合併,您現在應該能夠修改您的問題,對您收到的答案發表評論並接受答案。 –